選択した要素が一度だけ選択されるようにQuickCheckを使用してHaskellでジェネレーターを定義する方法を正確に知っている人はいますか?
「Gen(MaybePositive)」ジェネレーターが必要かもしれないことに気づきましたが、もちろんそれは繰り返しで数を生成します。選ばれた番号が繰り返されることなく選ばれるようにしたいと思います。数字が返される場合はちょうど返されたいし、ランダムがすべて使い果たされている場合はGenNothingが返されるようにします。
ありがとう、
マーク
選択した要素が一度だけ選択されるようにQuickCheckを使用してHaskellでジェネレーターを定義する方法を正確に知っている人はいますか?
「Gen(MaybePositive)」ジェネレーターが必要かもしれないことに気づきましたが、もちろんそれは繰り返しで数を生成します。選ばれた番号が繰り返されることなく選ばれるようにしたいと思います。数字が返される場合はちょうど返されたいし、ランダムがすべて使い果たされている場合はGenNothingが返されるようにします。
ありがとう、
マーク
できません。の定義をGen見てください。これまでに選択されたものについての状態を保持する方法はありません。同じ乱数発生器とサイズ制限を指定すると、常に同じ結果を生成する必要があります。ただし、繰り返しのない値のリストを生成する a を書くことはできます。単純な (しかしややナイーブな) ものは、このようなものになります。Eq a => Gen [a]
uniques :: Eq a => Gen a -> Gen [a]
uniques gen = fmap nub $ listOf gen
通常、QuickCheck はランダム化されたテスト用であり、網羅的なテスト用ではありません。徹底的なテストを処理する優れたライブラリがいくつかあります- smallcheckとlazysmallcheckを見てください。
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
私はそれをテストしていないので、マッサージが必要ですが、それがポイントを明確に伝えてくれることを願っています. 幸運を。