Haskell QuickCheck唯一随机数生成

时间:2011-07-26 12:29:03

标签: haskell quickcheck

有没有人确切知道如何使用QuickCheck在Haskell中定义生成器,以便仅选择ONCE中选择的元素?

我已经意识到我可能需要一个“Gen(可能是正面的)”生成器,但当然会产生重复的数字。我想要它,以便选择的数字被选中而不重复。在返回一个数字的情况下,我想要返回,并且在randoms全部耗尽的情况下,我希望Gen Nothing返回。

谢谢,

标记

3 个答案:

答案 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通常用于随机测试,而不是详尽的测试。 有一些很棒的库可以处理详尽的测试 - 请查看smallchecklazysmallcheck

答案 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

我没有测试过,所以它需要一些按摩,但我希望它清楚地传达了这一点。祝你好运。