2012-09-17 10 views
7

ho una funzione, rev, che restituisce un valore di un tipo che è in tre typeclasses:Come utilizzare modificatori con QuickCheck (positivo nel mio caso)

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

mi piacerebbe testare alcuni proprietà su di esso con quickcheck. Tuttavia, non sono interessato a testare i valori negativi dei tipi Integral perché sto utilizzando Integer per mancanza di un tipo Natural nella libreria di base. Così ho pensato, diamo l'opposto del valore generato quando il valore generato è negativo e starò bene:

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 proprietà testato non è importante qui - in particolare, non vale per valori molto semplici e ne sono a conoscenza, non è l'argomento di questa domanda)

Quindi mi sono imbattuto nel modificatore Positive e ho pensato che sebbene il mio test fosse ora funzionante, sarebbe bello implementarlo in un modo più carino. Così ho provato:

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

Devo ammettere che sono rimasto sorpreso quando ha compilato. Ma poi un errore spuntato durante l'esecuzione del test:

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

Così ho pensato, "MMK, dovrà dichiarare questa cosa Positive un'istanza di Read". Così l'ho fatto, ma l'istanza è già stata dichiarata nella libreria quickCheck perché sembra che Ghci mi abbia urlato.

E a questo punto mi sono perso, perché non trovo documentazione valida (se presente).

Qualsiasi puntatore che mi aiuti a capire i modificatori e altre cose carine nella libreria Quickcheck sarà apprezzato.

+5

Non c'è analisi perché 'rev (Positivo {getPositive = 1})' è 'letto"} 1 = evitisoPteg {evitisoP "'. –

risposta

17

Il modo comune di utilizzare questi modificatori è quello di abbinare il modello su di essi, ad es.

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

questo modo, avrà n tipo sottostante.

+0

blah non ha nemmeno pensato di provarlo. Silly me. Grazie :) – m09

Problemi correlati