Генерация списка списков Int с помощью QuickCheck
-
18-09-2019 - |
Вопрос
Я работаю до конца Реальный мир
Haskell одно из
упражнений главы 4 заключается в реализации foldr
основанная версия
concat
.Я подумал, что это будет отличным кандидатом для тестирования с помощью
QuickCheck, поскольку существует существующая реализация для проверки моих
результатов.Это, однако, требует, чтобы я определил экземпляр
Arbitrary
класс типов, который может генерировать произвольные [[Int]]
.До сих пор я
не мог понять, как это сделать.Моя первая попытка была:
module FoldExcercises_Test
where
import Test.QuickCheck
import Test.QuickCheck.Batch
import FoldExcercises
prop_concat xs =
concat xs == fconcat xs
where types = xs ::[[Int]]
options = TestOptions { no_of_tests = 200
, length_of_tests = 1
, debug_tests = True }
allChecks = [
run (prop_concat)
]
main = do
runTests "simple" options allChecks
Это приводит к тому, что тесты не выполняются.Глядя на различные биты и
я догадался, что Arbitrary
требуется декларация инстанции и
добавлен
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Это привело к жалобе ghci на то, что мое объявление экземпляра было
недействительным и что добавление -XFlexibleInstances могло бы решить мою проблему.Добавление {-# OPTIONS_GHC -XFlexibleInstances #-}
директива
приводит к несоответствию типов и предупреждению о перекрывающихся экземплярах.
Итак, мой вопрос в том, что нужно для того, чтобы это сработало?Я, очевидно, новичок в Haskell и не нахожу никаких ресурсов, которые могли бы мне помочь.Любые указания очень ценятся.
Редактировать
Похоже, я был введен в заблуждение выводом QuickCheck при первом тестировании fconcat
определяется как
fconcat = undefined
На самом деле правильная реализация функции действительно дает ожидаемый результат. ДУП!
Решение
[[Int]]
уже является Arbitrary
экземпляр (потому что Int
является Arbitrary
например, так и есть [a]
для всех a
ы, которые сами по себе являются экземплярами Arbitrary
).Так что проблема не в этом.
Я сам запустил ваш код (заменив import FoldExcercises
с fconcat = concat
) и он провел 200 тестов, как я и ожидал, так что я озадачен, почему он не делает это за вас.Но вам НЕ нужно добавлять Arbitrary
пример.