Haskell, ввод-вывод, монады, быстрая проверка

Новичок в Haskell здесь.

У меня есть функция и набор свойств для ее проверки, которые я написал с помощью quickcheck. Свойства работают, когда я запускаю их по отдельности в интерпретаторе, и функция работает нормально.

Однако ручная быстрая проверка каждого свойства в интерпретаторе вручную (quickCheck prop_this, quickCheck prop_that) скучна, однообразна и отнимает много времени. Я хотел бы вставить все это в программу, и эта программа запускала бы все быстрые проверки. Вот где я застрял.

Базовый скелет программы выглядит следующим образом:

imports...

function_which_i_want_to_quickcheck

prop_1
prop_2
etc...

main = do
    quickCheck prop_1
    quickCheck prop_2
    etc...

Я считаю, что все, что выше основного, в порядке, так как все компилируется и работает без него. Главное, с чем мне нужна помощь. Я пробовал несколько вариантов, т. е. не иметь do, использовать do, присваивать результаты с помощью «x ‹- quickCheck y», удалять quickCheck изнутри и вместо этого прикреплять его снаружи и т. д., но ничего не могу получить. Работа.

  1. Кто-нибудь может помочь с вышеизложенным?

  2. Если бы я хотел переместить все внутри main в другую (обычную, неосновную) функцию, как бы я это сделал?

РЕДАКТИРОВАТЬ: я ценю рекомендацию по тестированию фреймворков, но то, о чем я прошу здесь, тривиально сделать на любом другом языке и не нуждается в тестовом фреймворке. Почему не Хаскель?

Кроме того, это корректно работает прямо внутри интерпретатора. Я не могу заставить его работать внутри main. Есть идеи, почему?

quickCheck prop_1 >> quickCheck prop_2 >> quickCheck prop_3

Спасибо.


person user3355020    schedule 02.03.2014    source источник
comment
Если все ваше имущество относится к одному типу, вы можете поместить их в список и выполнить mapM_.   -  person Sibi    schedule 02.03.2014
comment
Не очень легко диагностировать проблему с невидимым кодом, имеющим невидимые ошибки. Хаскеллеры обладают сверхспособностями, но есть пределы.   -  person n. 1.8e9-where's-my-share m.    schedule 02.03.2014
comment
у вас есть вся информация, необходимая для диагностики. прочитай вопрос. я сказал, что все функции и код выше основной работы. что касается основного, это последовательность быстрой проверки. Вы говорите, что вам нужны настоящие имена функций или вы не можете диагностировать?   -  person user3355020    schedule 02.03.2014
comment
@user3355020 user3355020 ничего не может заставить работать - единственный разумный ответ на это работает для меня (что я и даю).   -  person Ingo    schedule 03.03.2014
comment
У нас нет необходимой информации. Вы должны предоставить нам полный образец кода, который дает сбой, чтобы мы могли запустить его, увидеть сообщение об ошибке и диагностировать проблему. Возможно, есть что-то тонкое в типе одного из ваших свойств, которое, например, здесь не очевидно.   -  person Paul Johnson    schedule 03.03.2014


Ответы (2)


Из вопроса не очень понятно, какие у вас проблемы, но в целом я бы рекомендовал использовать фреймворк для тестирования, такой как вкусно, чтобы вместе организовывать экспресс-тесты:

import Test.Tasty
import Test.Tasty.QuickCheck

main = defaultMain $ testGroup "Tests"
  [ testProperty "+ is commutative" $
      \x y -> x + y == (y + x :: Double)
  , testProperty "+ is associative" $
      \x y z -> (x + y) + z == (x + (y + z) :: Double)
  ]

Чтобы запустить это, вам нужно установить пакет tasty-quickcheck.

Вот как это выглядит при выполнении:

скриншот

person Roman Cheplyaka    schedule 02.03.2014

Раньше я использовал TestFramework. Это позволяет вам создавать произвольно вложенные тестовые группы, что дает вам возможность изменять входные параметры.

main = do
    defaultMain $ [tier1_tests, ...]

tier1_tests = testGroup "Level One Tests" [tier2_tests1, tier2_tests2, ...]

tier2_tests1 = testGroup "Level Two Testgroup 1" [tier3_tests1, youGetTheIdea, ...]
                 ] 
tier3_tests1 = testGroup "Level Three Testgroup" [
        testProperty "m=32 random encoding with good x" (prop_realTest1 8 32 True),
        testProperty "m=256 random encoding bad x" (prop_realTest2 128 256 False),
        ... ]

prop_realTest1 m goodq b = forAll arbitrary (\ x -> ...)
person crockeea    schedule 02.03.2014