List 生成一个保证包含7的列表

List 生成一个保证包含7的列表,list,haskell,quickcheck,List,Haskell,Quickcheck,我该怎么做?我想要一个结构为sevenList::Gen[Integer]的东西,它可以生成一个列表,并且保证总是至少包含一个7 我知道如果我想生成一个大小为n的列表,我可以这样做: listOfLength n gen = sequence [ gen | i <- [1..n] ] listOfLength n gen=sequence[gen | i您可以决定生成两个列表,然后构建一个列表,我们在其中添加一个夹在其中的七个列表 例如: genSevenList :: Gen [In

我该怎么做?我想要一个结构为
sevenList::Gen[Integer]
的东西,它可以生成一个列表,并且保证总是至少包含一个7

我知道如果我想生成一个大小为n的列表,我可以这样做:

listOfLength n gen = sequence [ gen | i <- [1..n] ]

listOfLength n gen=sequence[gen | i您可以决定生成两个列表,然后构建一个列表,我们在其中添加一个夹在其中的七个列表

例如:

genSevenList :: Gen [Integer]
genSevenList = do
    la <- arbitrary
    lb <- arbitrary
    return $ la ++ 7 : lb
genSevenList :: Gen [Integer]
genSevenList = do
    l <- arbitrary
    k <- choose (0,length l)
    let (la,lb) = splitAt k l
    return $ la ++ 7 : lb

尽管这两个调用都能够生成所有可能的列表,如@LeftRoundound所说,但第二个实现很可能会生成较短的列表,因为
aribtrary
调用都会生成较短的列表(或空列表)没有那么大。

您可以生成一个索引,在该索引处拆分,然后在该位置注入一个7。@WillemVanOnsem可能有效,但没有考虑到这一点。小结:请记住,从数学上讲,“随机列表”是不明确的,可能指所有列表集合上的任何分布。这里有许多选项。通常,使用的分布使长度以几何形式分布。同样,请注意,“至少包含一个7的随机列表”有许多分布。这两种方法之间的主要区别在于,如果有两个独立的
任意的
列表,则两个列表都不太可能为空,即案例
[7]
可能不会经常发生。因此,生成一个列表并在某处注入七个列表可能更适合覆盖率测试。