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

时间:2017-10-25 10:19:51

标签: list haskell quickcheck

我该怎么做?我希望结构var sID; function init() { PageMethods.GetSessionID(OnSuccess); } function OnSuccess(response, userContext, methodName) { sID = response; alert(sID); } 能够生成一个列表,并保证始终至少包含一个列表。

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

sevenList :: Gen [Integer]

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

1 个答案:

答案 0 :(得分:6)

你可以决定生成两个列表,然后构建一个列表,在这个列表中我们将列表夹在它们之间夹着七个。

例如:

FROM debian:stretch

RUN apt update
RUN apt install -y wget 

RUN wget https://stackoverflow.com/
# I know the wget is useless. Is just an example :)
CMD ["echo", "hello-world"]

前两个语句因此生成两个任意genSevenList :: Gen [Integer] genSevenList = do la <- arbitrary lb <- arbitrary return $ la ++ 7 : lb 列表,然后我们[Integer]。因此,我们在return $ la ++ 7 : lb前加lb,并将其附加到7

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

la

虽然两者都能够生成所有可能的列表,例如@leftroundabout说,但是第二个实现更有可能出现更短的列表,因为genSevenList :: Gen [Integer] genSevenList = do l <- arbitrary k <- choose (0,length l) let (la,lb) = splitAt k l return $ la ++ 7 : lb 两个调用的几率都会产生一个短列表(或者一个空列表)并不是那么大。