testing haskell quickcheck

testing - ¿Está probando propiedades QuickCheck contra varios tipos?



haskell (1)

No puedo compilar tu código, así que ... disparo a ciegas:

tratar

forallAtoms :: (forall a. (Atomic a, Show a) => a -> Bool) -> [TestOptions -> IO TestResult]

como una firma de tipo. Esto necesita la extensión de lenguaje -XRankNTypes.

El problema que tienes, según lo veo, es que GHC intenta encontrar un tipo para insertar para a en x :: (a -> Bool) para todo el alcance de la función, pero ya das tres diferentes allí.

Tengo una clase de tipo Atomic , que define funciones para convertir ciertos tipos a / desde un valor de contenedor ( Atom ). Me gustaría definir una propiedad QuickCheck que indique: "para todas las instancias de Atomic , cualquier valor puede almacenarse y recuperarse de forma segura". La propiedad se ve así:

class Atomic a where toAtom :: a -> Atom fromAtom :: Atom -> Maybe a prop_AtomIdentity x = fromAtom (toAtom x) == Just x

Sin embargo, si solo intento ejecutar esa propiedad a través de QuickCheck, solo selecciona una instancia ( Bool ) y la prueba. Actualmente estoy trabajando en eso al definir las firmas de tipo para cada tipo atómico compatible en la lista de prueba, pero esto es prolijo y propenso a errores:

containerTests = [ run (prop_AtomIdentity :: Bool -> Bool) , run (prop_AtomIdentity :: Word8 -> Bool) , run (prop_AtomIdentity :: String -> Bool) {- etc -} ]

Estoy tratando de definir una función que lo haga automáticamente:

forallAtoms :: (Atomic a, Show a) => (a -> Bool) -> [TestOptions -> IO TestResult] forallAtoms x = [ run (x :: Bool -> Bool) , run (x :: Word8 -> Bool) , run (x :: String -> Bool) {- etc -} ] containerTests = forallAtoms prop_AtomIdentity

Pero falla con un error de verificación de tipo:

Tests/Containers.hs:33:0: Couldn''t match expected type `Word8'' against inferred type `String'' In the first argument of `run'', namely `(x :: Word8 -> Bool)'' In the expression: run (x :: Word8 -> Bool) In the expression: [run (x :: Bool -> Bool), run (x :: Word8 -> Bool), run (x :: String -> Bool)]

¿Hay una mejor manera de probar una propiedad de control de calidad contra varios tipos? De lo contrario, ¿se puede hacer que forallAtoms funcione o que el sistema de tipos no lo admite?