有没有人确切知道如何使用QuickCheck在Haskell中定义生成器,以便仅选择ONCE中选择的元素?
我已经意识到我可能需要一个“Gen(可能是正面的)”生成器,但当然会产生重复的数字。我想要它,以便选择的数字被选中而不重复。在返回一个数字的情况下,我想要返回,并且在randoms全部耗尽的情况下,我希望Gen Nothing返回。
谢谢,
标记
答案 0 :(得分:4)
你做不到。看看definition of Gen
。到目前为止,没有任何方法可以对任何状态进行处理。给定相同的随机生成器和大小限制,它必须始终生成相同的结果。 可以然后编写一个Eq a => Gen [a]
来生成一个没有重复的值的列表。一个简单的(但有点幼稚)就是这样的。
uniques :: Eq a => Gen a -> Gen [a]
uniques gen = fmap nub $ listOf gen
答案 1 :(得分:3)
QuickCheck通常用于随机测试,而不是详尽的测试。 做有一些很棒的库可以处理详尽的测试 - 请查看smallcheck和lazysmallcheck。
答案 2 :(得分: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
我没有测试过,所以它需要一些按摩,但我希望它清楚地传达了这一点。祝你好运。