2013-04-24 66 views
5

我爲foldl寫了一個實現,並想檢查它是否工作,我嘗試了一些情況,它似乎運行良好,但我想確保。使用quickCheck

我也讀到了快速檢查,並嘗試過,但我似乎無法使它發揮作用,這是代碼

foldl'' :: (b -> a -> b) -> b -> [a] -> b 

test :: Eq b => (b -> a -> b) -> b -> [a] -> Bool 
test f e ls = foldl'' f e ls == foldl f e ls 

當我運行quickCheck test它引發以下錯誤:

No instance for (Show (b0 -> a0 -> b0)) 
    arising from a use of `quickCheck' 
Possible fix: 
    add an instance declaration for (Show (b0 -> a0 -> b0)) 
In the expression: quickCheck prueba 
In an equation for `it': it = quickCheck prueba 

回答

7

你的財產需要三個輸入:一個函數,一個元素和一個列表。問題是QuickCheck不知道如何處理一般的函數。

QuickCheck需要工作的一件事是將失敗的測試用例寫入控制檯。爲此,它需要的值可以變成String - Show類中的任何值。由於函數不在Show中,因此它不能用於輸入。這就是你的錯誤信息來自何處。

一般來說,使用隨機生成的函數進行測試將會非常棘手。我只是寫一些具體的函數,讓QuickCheck隨機生成起始值和元素列表。

2

據我所知,在QuickCheck中有用於創建隨機函數的機器(請參見Test.QuickCheck.Function),但我不能說我知道這些東西足以告訴你如何使用它。

這就是說,測試你的財產可能使你選擇自己的功能更有意義,所以你可以寫一些像quickCheck $ prueba (+),這將正常工作。

6

有一種方法可以避免Show使用Blind修飾符對輸入進行約束,這將允許您使用QuickCheck的機器來生成隨機函數。

-- Using Int instead of a, b which would be defaulted to() in GHCi 
prueba :: Blind (Int -> Int -> Int) -> Int -> [Int] -> Bool 
prueba (Blind f) e ls = foldl'' f e ls == foldl f e ls 

這就是說,這意味着故障輸出對於調試幾乎是無用的,因爲它只會打印(*)盲人輸入。 (爲了演示,我定義foldl'' = foldr . flip)範圍

> quickCheck prueba 
*** Failed! Falsifiable (after 4 tests and 2 shrinks):  
(*) 
0 
[1,0] 
+0

不:類構造函數或類'盲」 – chamini2 2013-04-25 02:40:04

+0

@ chamini2:你有沒有進口'Test.QuickCheck'? – hammar 2013-04-25 02:50:35

+0

是的,也許是因爲我在OS X上?'ghci --version:The Glorious Glasgow Haskell Compilation System,version 7.4.2' – chamini2 2013-04-25 03:37:15