Haskell无限列表与交替标志

时间:2018-03-07 08:35:20

标签: list haskell infinite

我尝试生成这样的无限列表:

[1,-2,3,-4..]

使用此代码:

[ m  | n <- [1..],m <- [n, -n]]

但是这段代码重复了所有这样的数字:

[1,-1,2,-2..]

所以我不知道该怎么做

2 个答案:

答案 0 :(得分:11)

您可以按如下方式对这些进行分组:

[[1, -2], [3, -4],..]

因此,我们制作i的元组,其中i使得跳数为2,而对于i,我们会生成i-i-1

[ m  | n <- [1,3..], m <- [n, -n-1]]

然后例如我们可以屈服:

Prelude> take 10 [ m  | n <- [1,3..], m <- [n, -n-1]]
[1,-2,3,-4,5,-6,7,-8,9,-10]

或者我们可以把它写成:

[1, 3..] >>= \i -> [i, -i-1]

我们也可以使用zipWith

zipWith (*) [1..] $ cycle [1, -1]

或者我们迭代函数的解决方案:

zipWith ($) (cycle [id, negate]) [1..]

答案 1 :(得分:1)

可能性:

> x = concatMap (\i -> [i,-i-1]) [i | i <- [0..], even i]
> take 10 x
[0,-1,2,-3,4,-5,6,-7,8,-9]