Haskell如何生成这个无限列表?

Tem*_*ora 6 haskell list infinite cyclic

我看到这段代码生成斐波纳契数.

fibs = 1:1:(zipWith (+) fibs (tail fibs))

是否可以编写类似的样式代码来生成无限列表[1 ..]?

我在Haskell网站上的循环结构上看到了这个链接.

给出了一个例子

cyclic = let x = 0 : y
         y = 1 : x
     in  x
Run Code Online (Sandbox Code Playgroud)

我试图以循环方式为我的问题定义一个列表,但是不能成功.我想要的是一个根据自身定义的列表,它在Hasekll中评估为[1 ..].

注:Haskell的[1..]计算结果为[1,2,3,4,5...],而不是[1,1,1...].

Mik*_*kov 11

以下应该给你想要的结果:

nats = 1 : map (+1) nats
Run Code Online (Sandbox Code Playgroud)

或者,更具有惯用力:

nats = iterate (+1) 1
Run Code Online (Sandbox Code Playgroud)

[1,2,3...]通过使用等式推理,很容易看出为什么第一个片段的评估结果如下:

nats = 1 : map (+1) nats 
     = 1 : map (+1) (1 : map (+1) nats) 
     = 1 : map (+1) (1 : map (+1) (1 : map (+1) nats))
     = 1 : 1 + 1 : 1 + 1 + 1 : .... 
     = [1,2,3...]
Run Code Online (Sandbox Code Playgroud)


Tik*_*vis 6

是.

考虑如何写出列表中的每个元素:

1
1 + 1
1 + 1 + 1
1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
Run Code Online (Sandbox Code Playgroud)

每次输入后,每个后续条目都有一个额外的条目+ 1.所以我们想要开始,1然后添加1到每个后续元素.然后我们想要第二个元素并1在之后添加到所有内容中.

以下是我们如何做到这一点:

let xs = 1 : map (+ 1) xs
Run Code Online (Sandbox Code Playgroud)

这扩展如下:

1 : map (+ 1) xs
1 : (1 + 1) : map (+ 1) xs
1 : (1 + 1) : ((1 + 1) + 1) : map (+ 1) xs
Run Code Online (Sandbox Code Playgroud)

等等.