4

選択した要素が一度だけ選択されるようにQuickCheckを使用してHaskellでジェネレーターを定義する方法を正確に知っている人はいますか?

「Gen(MaybePositive)」ジェネレーターが必要かもしれないことに気づきましたが、もちろんそれは繰り返しで数を生成します。選ばれた番号が繰り返されることなく選ばれるようにしたいと思います。数字が返される場合はちょうど返されたいし、ランダムがすべて使い果たされている場合はGenNothingが返されるようにします。

ありがとう、

マーク

4

3 に答える 3

5

できません。の定義をGen見てください。これまでに選択されたものについての状態を保持する方法はありません。同じ乱数発生器とサイズ制限を指定すると、常に同じ結果を生成する必要があります。ただし、繰り返しのない値のリストを生成する a を書くことはできます。単純な (しかしややナイーブな) ものは、このようなものになります。Eq a => Gen [a]

uniques :: Eq a => Gen a -> Gen [a]
uniques gen = fmap nub $ listOf gen
于 2011-07-26T12:46:50.860 に答える
3

通常、QuickCheck はランダム化されたテスト用であり、網羅的なテスト用ではありません。徹底的なテストを処理する優れたライブラリがいくつかあります- smallchecklazysmallcheckを見てください。

于 2011-09-23T19:18:20.583 に答える
0

permutationsこれには(モジュール内で) を使用できますData.List

の関数シグネチャは次のpermutationsとおりです。

permutations :: [a] -> [[a]]

ご覧のとおり、リストのリストを返します。以下に小さな例を示します (GHCi 7.0.4 を使用):

> permutations [1..3]
[[1,2,3],[2,1,3],[3,2,1],[2,3,1],[3,1,2],[1,3,2]]

したがって、次のようなことができます。

prop_unique_elements = forAll (elements (permutations [1..3])) $ \x -> foo == bar

私はそれをテストしていないので、マッサージが必要ですが、それがポイントを明確に伝えてくれることを願っています. 幸運を。

于 2011-09-21T20:14:00.597 に答える