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 !

Foi útil?

Solução

[[Int]] já é uma instância Arbitrary (porque Int é uma instância Arbitrary, assim é [a] para todos os as 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top