【问题标题】:Haskell infinite list with alternating signs具有交替符号的 Haskell 无限列表
【发布时间】:2018-08-15 06:51:33
【问题描述】:

我尝试像这样生成一个无限列表:

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

使用此代码:

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

但是这段代码会像这样重复所有数字:

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

所以我不知道该怎么办

【问题讨论】:

  • 也许想一想如何将[1..] 变成您的列表,一次只有一个元素。所有负数的共同点是什么?

标签: list haskell infinite


【解决方案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..],但这是个人喜好。
  • @Zeta:大声笑,编辑和评论几乎是同时出现的,一个字符等效的答案的几率是多少:)。
【解决方案2】:

一种可能性:

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

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多