11

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

残念ながら、ShowQuickCheckが失敗の原因となった入力を報告できるようにプロパティへの入力を実装する必要があるため、これはコンパイルされませんが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モジュールにあると私に言います、しかしそれは文書化されていません、そして私はそこにあるものが何のためにあるのか、それがどのように使われるのかをタイプシグネチャーを見ただけでは理解できません。

4

2 に答える 2

10

あなたが正しいTest.QuickCheck.Functionのは正しい答えです。タイプを変更するだけです。

prop_composition       :: Fun Int Int -> Fun Int Int -> Int -> Bool
prop_composition f g x = ((apply f) . (apply g)) x == (apply f) ((apply g) x)
于 2011-03-06T09:46:26.387 に答える
3

import Text.Show.Functions、元の署名を保持したまま使用することもできます。

于 2012-05-23T01:19:26.387 に答える