【发布时间】:2018-08-15 06:51:33
【问题描述】:
我尝试像这样生成一个无限列表:
[1,-2,3,-4..]
使用此代码:
[ m | n <- [1..],m <- [n, -n]]
但是这段代码会像这样重复所有数字:
[1,-1,2,-2..]
所以我不知道该怎么办
【问题讨论】:
-
也许想一想如何将
[1..]变成您的列表,一次只有一个元素。所有负数的共同点是什么?
我尝试像这样生成一个无限列表:
[1,-2,3,-4..]
使用此代码:
[ m | n <- [1..],m <- [n, -n]]
但是这段代码会像这样重复所有数字:
[1,-1,2,-2..]
所以我不知道该怎么办
【问题讨论】:
[1..] 变成您的列表,一次只有一个元素。所有负数的共同点是什么?
您可以将它们分组如下:
[[1, -2], [3, -4],..]
所以我们创建了i 的元组,其中i 进行了两个跳跃,对于这样的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..]
【讨论】:
replicate [1, -1]?你不是说cycle [1, -1]吗?顺便说一句,我更喜欢zipWith ($) (cycle [id, negate]) [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]
【讨论】: