2015-02-06 1 views
8

Ich versuche QuickCheck nach another answer zu verwenden. Ich teste wie folgt aus:quickCheckAll gibt immer "True" zurück

{-# LANGUAGE TemplateHaskell #-} 
import Test.QuickCheck 
import Test.QuickCheck.All 


last' :: [a] -> a 
last' [x] = x 
last' (_:xs) = last' xs 

prop_test x = last' x == last x 

check = do 
     putStrLn "quickCheck" 
     quickCheck (prop_test :: [Char]-> Bool) 

check2 = do 
     putStrLn "quickCheckAll" 
     $quickCheckAll 

Dann lade ich es in winGHCI und rufen check und check2. Ich bekomme

quickCheck 
*** Failed! (after 1 test): 
Exception: 
    list.hs:(7,1)-(8,23): Non-exhaustive patterns in function last' 
"" 

was ich denke, es ist vernünftig. Ich dies jedoch erhalten von check2

quickCheckAll 
True 

Ich bin verwirrt, denn egal, wie ich die last' Funktion ändern, auch falsch, quickCheckAll immer wahr zurück.

Was ist falsch an meinem Code? Wie kann ich das beheben?

+0

Für was es wert ist, wenn ich es versuche, bekomme ich auch eine Warnung: "Name prop_test in der Quelldatei gefunden, war aber nicht im Bereich" (mit einer Zeilennummer auf den Aufruf von 'quickCheckAll'). Sehr geheimnisvoll. –

Antwort

10

Aus dem Test.QuickCheck.All docs:

quickCheckAll zu verwenden, eine Definition zu Ihrem Modul entlang der Linien von

return [] 
runTests = $quickCheckAll 

und dann runTests ausführen hinzuzufügen.

Hinweis: das bizarre return [] im obigen Beispiel wird auf GHC 7.8 benötigt; Ohne es wird quickCheckAll keine der Eigenschaften finden können.

Hinzufügen return [] vor Ihrer check macht es für mich arbeiten.

0

quickCheckAll nutzen zu können, müssen Sie eine Funktion, die lautet:

Der andere Kommentar erwähnt dies

return [] runTests = $quickCheckAll, weisen aber darauf hin nicht, dass es noch immer wahr zurück, wenn die Funktion unter allen liegt Ihrer QuickCheck-Funktionen!