Генерация списка списков Int с помощью QuickCheck

StackOverflow https://stackoverflow.com/questions/1690792

  •  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 пример.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top