1つ以上の関数を入力として受け取るQuickCheckプロパティを作成しようとしています。物事を単純にするために、関数の合成が連続する関数の適用と同等であることを確認するためのプロパティと、手っ取り早いテストドライバーを検討してください。
import Test.QuickCheck
prop_composition :: (Int -> Int) -> (Int -> Int) -> Int -> Bool
prop_composition f g x = (f . g) x == f (g x)
main :: IO ()
main = quickCheck prop_composition
残念ながら、Show
QuickCheckが失敗の原因となった入力を報告できるようにプロパティへの入力を実装する必要があるため、これはコンパイルされませんがShow
、関数の実装はありません。
Test.hs:10:7:
No instance for (Show (Int -> Int))
arising from a use of `quickCheck' at Test.hs:10:7-33
Possible fix: add an instance declaration for (Show (Int -> Int))
In the expression: quickCheck prop_composition
In the definition of `main': main = quickCheck prop_composition
私はShow
関数のために自分の何もしないインスタンスを書いてみました...
instance Show (a -> b) where
show _ = "[func]"
...コンパイルしますが、警告をトリガーし-Wall
ます...
Test.hs:3:9: Warning: orphan instance: instance Show (a -> b)
...これを行うにはもっと正しい方法があると思います。
私の腸は答えがTest.QuickCheck.Function
モジュールにあると私に言います、しかしそれは文書化されていません、そして私はそこにあるものが何のためにあるのか、それがどのように使われるのかをタイプシグネチャーを見ただけでは理解できません。