La generación de una lista de listas de Int con QuickCheck
-
18-09-2019 - |
Pregunta
Estoy trabajando a través mundo real
Haskell una de las
ejercicios del capítulo 4 es implementar una versión de foldr
concat
. Pensé que esto sería un gran candidato para las pruebas con
QuickCheck ya que existe una aplicación existente para validar mi
resultados. Sin embargo, esto me obliga a definir una instancia de la
clase de tipos Arbitrary
que puede generar [[Int]]
arbitraria. Hasta ahora tengo
sido incapaz de encontrar la manera de hacer esto. Mi primer intento fue:
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
Esto da como resultado no hay pruebas de que se realiza. En cuanto a varios bits y
piezas que supuso que era necesaria una declaración de instancia y Arbitrary
añadido
instance Arbitrary a => Arbitrary [[a]] where
arbitrary = sized arb'
where arb' n = vector n (arbitrary :: Gen a)
Esto dio lugar a ghci quejaba de que mi declaración de instancia era
-XFlexibleInstances adición no válidos y que podrían resolver mi problema.
La adición de la directiva {-# OPTIONS_GHC -XFlexibleInstances #-}
resulta en una falta de coincidencia de tipo y un casos de solapamiento de advertencia.
Así que mi pregunta es ¿qué se necesita para hacer este trabajo? Obviamente estoy nuevo a Haskell y no estoy encontrando todos los recursos que me ayudan a cabo. Cualquier punteros son muy apreciados.
Editar
Parece que estaba equivocada por la salida de QuickCheck cuando en una prueba primero fconcat
manera se define como
fconcat = undefined
En realidad la implementación de la función correcta de hecho da el resultado esperado. DOOP
Solución
[[Int]]
ya es una instancia Arbitrary
(porque Int
es una instancia Arbitrary
, por lo que es [a]
para todos los a
s que son ellos mismos casos de Arbitrary
). Así que ese no es el problema.
Me encontré a mí mismo el código (en sustitución de import FoldExcercises
con fconcat = concat
) y se corrió 200 pruebas como yo hubiera esperado, así que estoy desconcertado por qué no lo haga por usted. Pero usted no necesita agregar una instancia Arbitrary
.