2016-09-02 3 views
5

Wir haben zwei Funktionen, die 2 verschiedene power Funktionen vergleichen und True zurückgeben, wenn sie den gleichen Wert (am selben Eingang) zurückgeben. Dann haben wir 2 andere Funktionen, die diese Funktionen gegen 2 Listen testen, um zu sehen, ob es irgendeinen Wert gibt, der nicht wahr zurückgibt.Nur positive ganze Zahlen mit QuickCheck

Aber anstatt Listen, die [1..100] Bereiche verwenden, möchten wir Quickcheck verwenden. So ist es möglich, schnell zu überprüfen, dass nur positive Ganzzahlen zurückgegeben werden.

Code:

comparePower1 :: Integer -> Integer -> Bool 
comparePower1 n k = power n k == power1 n k 

comparePower2 :: Integer -> Integer -> Bool 
comparePower2 n k = power n k == power2 n k 

testing1 = and [comparePower1 n k | n <- [0..100], k <- [0..100]] 
testing2 = and [comparePower2 n k | n <- [0..100], k <- [0..100]] 
+0

vielleicht http://stackoverflow.com/questions/12466580/how-to-use-modifiers-with-quickcheck-positive-in-my-case helfen? –

+0

@TomaszLewowski Nicht wirklich. Ich habe diese Typklasse/Definition nicht verstanden. (Integral a, Zeige ein, lies a) => ... ' –

+0

Wie wäre es mit' soThat' Modifikator für Generator? –

Antwort

7

Quick Check hat die Unterstützung für Positive numbers, aber aus Gründen der diesem Tutorial werde ich Ihnen zeigen, wie Sie Ihre eigenen Generator erstellen. Eine der Haupteigenschaften von QuickCheck ist, dass Sie Ihren eigenen Generator entwerfen können, um genau das auszugeben, was Sie brauchen. Zum Beispiel

genPos :: Gen Int 
genPos = abs `fmap` (arbitrary :: Gen Int) `suchThat` (> 0) 

Dann können Sie Ihre eigene Liste genereator

genListOfPos :: Gen [Int] 
genListOfPos = listOf genPos 

Schließlich erstellen Sie forAll verwenden können, um den Generator und Gewinn übergeben.

main :: IO() 
main = do 
    quickCheck $ forAll genPos $ \x -> x > 0 
    quickCheck $ forAll genListOfPos $ all (> 0) 
+0

Thx, es hat funktioniert! Eine Frage: Warum muss ich die neue Liste nicht auf die Testfunktion anwenden, oder zumindest die dort vorhandene Liste löschen ('[1..100]')? Oder vielleicht sollte meine Frage sein, was genau macht diese Funktion mit dieser Liste jetzt? –

+0

'all (> 0)' expandiert zu '\ xs -> all (\ x -> x> 0) xs' was bedeutet, dass man' \ x -> x> 0' auf jedes Element von 'xs' anwendet und dann' ausführt all, um zu überprüfen, ob alle Elemente "True" sind – mariop

+0

Aus Gründen der Effizienz könnte es besser sein, ein Wort zu generieren, 1 hinzuzufügen, zu Int zu werfen, den absoluten Wert zu nehmen und dann null zu werfen. Der Grund, warum * das * vielleicht besser ist, ist, dass ich glaube, dass QuickCheck normalerweise versucht, hauptsächlich "kleine" Werte zu wählen, so dass Sie viele Nullen zum Wegwerfen haben könnten. Sie müssen jedoch einige Details überprüfen, bevor Sie diesen Rat befolgen - ich könnte mich irren. – dfeuer

Verwandte Themen