-2
  1. 次のコードの CoArbitrary に渡す ex は何ですか?

  2. Test.QuickCheck.Function で Function を使用して、命題で f と g を表す方法は?

  3. と書くのは正しいですか、そうでない場合、どのように?

    where types = [f, g] :: [関数]

  4. バリアントは Function を受け入れることができますか? 私が知っているように、生成関数は><またはQuickCheckのソースコードに記載されているバリアントをよく使用します

エラー:

<interactive>:1:12:
    No instance for (Eq (b0 -> b0))
      arising from a use of `prop_commutative'
    Possible fix: add an instance declaration for (Eq (b0 -> b0))
    In the first argument of `quickCheck', namely `prop_commutative'
    In the expression: quickCheck prop_commutative
    In an equation for `it': it = quickCheck prop_commutative

[更新しました]

CoArbitrary http://www.google.com.hk/url?sa=t&rct=j&q=QuickCheck+meiser.pdf&source=web&cd=1&ved=0CBwQFjAA&url=http%3A%2F%2Fwww.st.cs は実装されていません。 uni-saarland.de%2Fedu%2Fseminare%2F2005%2Fadvanced-fp%2Fslides%2Fmeiser.pdf&ei=hhfHTo_ZDdCciAethMjqDw&usg=AFQjCNFF467CXacWGMkN8jvgqatkcLcVcg

別の記述は、関数の例を模倣し、ghci の '=' でエラーを解析 let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f) できます。

コード:

import Test.QuickCheck.Function
import Test.QuickCheck.Gen
import Test.QuickCheck

let prop_commutative (Fun _ f) (Fun _ g) = (f.g) == (g.f)

main = quickCheck prop_commutative
4

2 に答える 2

3

QuickCheckは反例を探します。したがって、求めるプロパティの否定を提供する必要があります。

prop1 f g x = not $ (f . g) x == (g . f) x

この特定のプロパティは関数の型を指定していません-のどの関数も機能する可能性がありますa -> afしたがって、およびg、または関数全体のタイプを指定する必要がありますprop1

  1. それらは両方とも関数であり、Haskellで無限ドメインを持つ関数の賢明な定義を持つことができないため、比較f . gg . fて同等にすることはできません。Eq引数もランダムに生成し、ランダムな引数を両方に渡して結果を比較することにより、関数f . gと関数を比較する必要があります。g . f

  2. のタイプに関するドキュメントをお読みくださいFun _ f単形関数fがあります。QuickCheckは、さまざまなタイプのランダム関数を生成できません。特定のタイプの関数のみを生成できます。しかし、多形であるため、特定のタイプのfをコンテキストから推測することはできません。したがって、との任意の型を選択し、プロパティの型シグネチャで指定する必要があります。.fg

letまた、トップレベルの定義は必要ありません。の形式の式の内部と、。のないブロックの内部でのみ使用let..inできdoますin

于 2011-11-18T13:17:31.690 に答える
-1

nponeccop からメモを取って、次のテンプレートをお勧めします。

import Test.QuickCheck

prop_commutative f g x = ...

main = quickCheck $ prop_commutative f g
  where f x = ...
        g x = ...

このアプローチでは、反例を考え出す必要があります。簡単です。2 つの関数を考えてみてください。両方の方法で構成すると、同じ結果は得られません。このアプローチは、部分適用も利用します。に 2 つの関数を渡し、quickCheck を生成してテストするためprop_commutativeだけに残しました。x

ただし、これは単純すぎるかもしれません。これができる場合、次のステップは特定の反例を取り除き、quickCheck に関数を生成させる方法を理解することです。

于 2011-11-18T21:39:23.473 に答える