Gerar uma lista de listas de Int com QuickCheck
-
18-09-2019 - |
Pergunta
Eu estou trabalhando através Real World
Haskell um dos
exercícios do capítulo 4 é implementar uma versão foldr
base de
concat
. Eu pensei que este seria um grande candidato para testes com
QuickCheck uma vez que existe uma implementação existente para validar o meu
resultados. Este, porém, exige-me para definir uma instância da
typeclass Arbitrary
que pode gerar [[Int]]
arbitrária. Até agora eu tenho
foi incapaz de descobrir como fazer isso. Minha primeira tentativa foi:
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
Isso resulta em nenhum teste que está sendo executada. Olhando para vários pedaços e
peças Imaginei que uma declaração exemplo Arbitrary
era necessário e
adicionado
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Isto resultou em queixa ghci que a minha declaração instância foi
inválido e que a adição de -XFlexibleInstances pode resolver o meu problema.
Adicionando a directiva {-# OPTIONS_GHC -XFlexibleInstances #-}
resulta em uma incompatibilidade de tipo e um aviso de casos de sobreposição.
Então, minha pergunta é o que é necessário para fazer este trabalho? Estou obviamente novo para Haskell e não estou encontrando quaisquer recursos que me ajudar. Os ponteiros são muito apreciados.
Editar
Parece que eu estava equivocada pela saída do QuickCheck quando em um teste primeiro fconcat
forma é definida como
fconcat = undefined
Na verdade implementar a função corretamente, de fato dá o resultado esperado. DOOP !
Solução
[[Int]]
já é uma instância Arbitrary
(porque Int
é uma instância Arbitrary
, assim é [a]
para todos os a
s que são eles próprios casos de Arbitrary
). Então isso não é o problema.
Corri seu código de mim mesmo (substituindo import FoldExcercises
com fconcat = concat
) e funcionou 200 testes como eu teria esperado, por isso estou perplexo a respeito de porque ele não faz isso por você. Mas você não precisa adicionar uma instância Arbitrary
.