2015-09-22 14 views
7

wは簡単なテストに対してQuickCheckを実行:次を考える/機能

test :: (Int -> Int) -> Int -> Bool 
test _ _ = True 

ソースをコンパイルした後、私はquickCheck testを実行しよう:

> quickCheck test 
<interactive>:27:1: 
    No instance for (Show (Int -> Int)) 
     arising from a use of ‘quickCheck’ 
    In the expression: quickCheck test 
    In an equation for ‘it’: it = quickCheck test 

このShow instance for functionsを見ると、それはように私には見えますそのようなインスタンスは存在しません。

quickCheck testを実行すると、Int -> IntShowインスタンスが回避されますか?

答えて

8

QuickCheckには、表示できる「機能」を生成するための特別なモジュールTest.QuickCheck.Functionがあります(また、QuickCheckが反例を簡略化する方法も「縮小」されています)。 applyを使用してそれらを通常の関数に変換できます。 GHCiの中に続いて

import Test.QuickCheck 
import Test.QuickCheck.Function 

test :: Fun Int Int -> Int -> Bool 
test _ _ = True 

test2 :: Fun Int Int -> Int -> Bool 
test2 f x = apply f x == x 

:あなたは、ファイルがある場合たとえば

*Main> quickCheck test 
+++ OK, passed 100 tests. 
*Main> quickCheck test2 
*** Failed! Falsifiable (after 2 tests and 3 shrinks): 
{_->0} 
1 

それを機能のために自分をShowインスタンスを定義し、それを使用する実際に可能です。しかし、あなたの入力タイプがBoolのような有限型でない限り、このような関数に関するすべての情報を出力することはできません。 Text.Show.Functionsから、有用な情報を示すダミーインスタンスをインポートできます。

しかし、上記で使用されたTest.QuickCheck.Function.Funタイプは、必要な情報をより簡潔に提供するように設計されているようです。可能であれば、私は確かにそれを使用します。

関連する問題