2012-09-17 16 views
7

He una función, rev, que devuelve un valor de un tipo que se encuentra en tres clases de tipos:Cómo utilizar modificadores con QUICKCHECK (positiva en mi caso)

rev :: (Integral a, Show a, Read a) => a -> a 
rev = read . reverse . show 

me gustaría probar algunos propiedad al respecto con quickcheck. Sin embargo, no estoy interesado en probar valores negativos de tipos Integrales porque estoy usando Integer por falta de un tipo Natural en la biblioteca base. Así que pensé, tomemos el opuesto del valor generado cuando el valor generado es negativo y estaré bien:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n | n >= 0 = (rev.rev) n == n 
      | otherwise = let n' = -n in (rev.rev) n' == n' 

(la propiedad probados no es importante en este caso - en particular, que no se cumple para valores muy básicos y estoy al tanto de eso, no es el tema de esta pregunta)

Luego me encontré con el modificador Positive y pensé que aunque mi prueba ahora estaba funcionando, sería bueno implementarlo en una manera más agradable. Así que probé:

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id n = (rev.rev) n == n 

Debo admitir que me sorprendió cuando compiló. Pero entonces apareció un error cuando se ejecuta la prueba:

*** Failed! Exception: 'Prelude.read: no parse' (after 1 test): 
Positive {getPositive = 1} 

Así que pensé, "MMK, debe declarar este Positive que una instancia de Read". Así que hice eso, pero la instancia ya está declarada en la biblioteca quickCheck, parece porque ghci me gritó.

Y en este punto estoy perdido, ya que no encuentro buena documentación (si corresponde).

Se apreciará cualquier apuntador que me ayude a comprender los modificadores y otras cosas agradables en la biblioteca de comprobación rápida.

+5

No hay análisis porque 'rev (Positive {getPositive = 1})' is 'read"} 1 = evitisoPteg {evitisoP "'. –

Respuesta

17

La forma común de usar estos modificadores es hacer coincidir los patrones en ellos, p.

prop_id :: (Integral a, Show a, Read a) => Positive a -> Bool 
prop_id (Positive n) = (rev.rev) n == n 

De esta manera, n tendrá el tipo subyacente.

+0

blah ni siquiera pensó en intentar eso. Tonto de mí. Gracias :) – m09

Cuestiones relacionadas