生成一个保证其中有 7 的列表

Generate a list that is garanteed to have a 7 in it

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

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

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

但这还不够,因为如果我生成一个长度为 10 的列表而没有生成 7,我必须继续,但目前它不会。

您可以决定生成两个列表,然后构造一个列表,我们在列表中附加一个 7。

例如:

genSevenList :: Gen [Integer]
genSevenList = do
    la <- arbitrary
    lb <- arbitrary
    return $ la ++ 7 : lb

因此,前两个语句生成两个任意 [Integer] 列表,然后我们 return $ la ++ 7 : lb。因此,我们在 lb 前面加上 7,并将其附加到 la.

您还可以生成一个任意列表,将其拆分为随机索引,然后如上所述将这些部分连接在一起。例如:

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

虽然两者都能够生成所有可能的列表,如@leftroundabout 所说,但第二种实现更有可能产生较短的列表,因为两个 aribtrary 调用都会生成较短的列表列表(或空列表)没有那么大。