2013-04-24 9 views
5

foldlの実装を書いて、それがうまく機能しているかどうかを確認したい場合、いくつかのケースを試してみましたが、うまくいくように見えますが、確認したいと思います。quickcheckの使用

私は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

プロパティには、関数、要素、リストの3つの入力が必要です。問題は、QuickCheckは一般的な関数の処理方法を知らないことです。

クイックチェックの作業の1つは、失敗したテストケースをコンソールに書き込む機能です。このためにはString - Showクラスのものに変換できる値が必要です。関数はShowにありませんので、入力には使用できません。それがあなたのエラーメッセージの出所です。

一般に、テストのためにランダムに生成された関数を使用することは、かなりトリッキーになるでしょう。私はちょっと具体的な関数を書いて、QuickCheckに開始値と要素のリストをランダムに生成させてもらいました。

2

私が理解しているところでは、QuickCheck(Test.QuickCheck.Function参照)にランダムな機能を作成するための機械がありますが、この使い方を教えてくれるとは思えません。

あなたの財産をテストすることは、あなた自身で選択した関数にはより意味があるので、うまくいくでしょう。quickCheck $ prueba (+)のようなものを書くことができます。

6

Blind修飾子を使用して入力にShowの制約を回避する方法があります。これにより、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 

が、これはそれだけで盲目の入力のための(*)を印刷しますと、故障の出力は、デバッグのためにほとんど役に立たないことを意味します。スコープで

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

ない(デモでは、私はfoldl'' = foldr . flipを定義した):型コンストラクタまたはクラス 'ブラインド」 – chamini2

+0

chamini2 @:あなたは' Test.QuickCheck'を輸入していますか? – hammar

+0

はい、おそらく私はOS X上にいるのでしょうか? 'ghci --version:Glorious Glasgow Haskell Compilation System、バージョン7.4.2' – chamini2

関連する問題