生成一个保证其中有 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
调用都会生成较短的列表列表(或空列表)没有那么大。
我该怎么做?我想要一些具有结构 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
调用都会生成较短的列表列表(或空列表)没有那么大。