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

¿Fue útil?

Solución

[[Int]] ya es una instancia Arbitrary (porque Int es una instancia Arbitrary, por lo que es [a] para todos los as 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top