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.
Non c'è analisi perché 'rev (Positivo {getPositive = 1})' è 'letto"} 1 = evitisoPteg {evitisoP "'. –