Stellen Test.QuickCheck.Batch einen Standardtyp für die Prüfung Listenfunktionen verwenden
-
09-06-2019 - |
Frage
Ich teste eine Funktion namens Extraktionen, die über jede Liste arbeitet.
extractions :: [a] -> [(a,[a])]
extractions [] = []
extractions l = extract l []
where extract [] _ = []
extract (x:xs) prev = (x, prev++xs) : extract xs (x : prev)
Ich mag es testen, zum Beispiel mit
import Test.QuickCheck.Batch
prop_len l = length l == length (extractions l)
main = runTests "extractions" defOpt [run prop_len]
Aber das wird nicht kompilieren; Ich habe eine Art entweder für run
oder prop_len
zu liefern, weil Quick Check nicht [a]
erzeugen kann, hat es etwas Konkretes zu erzeugen. Also wählte ich Int
:
main = runTests "extractions" defOpt [r prop_len]
where r = run :: ([Int] -> Bool) -> TestOptions -> IO TestResult
Gibt es eine Möglichkeit Quick Check zu bekommen a
für mich zu wählen anstatt es in der Art der run
angegeben?
Lösung
Das Quick Check Handbuch sagt "nein":
Eigenschaften müssen monomorphic Typen haben. `Polymorphe‘ Eigenschaften wie die oben, muss auf einen bestimmten Typ beschränkt werden, um für die Prüfung verwendet werden. Es ist bequem, dies zu tun, indem sie die Art von einem oder mehr Argumenten in einer Angabe
Dabei gilt Typen = (x1 :: t1, x2 :: t2, ...)
Klausel ...