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

时间:2013-11-03 02:48:30

标签: list haskell infinite cyclic

我看到这段代码生成斐波那契数字。

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

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

我在Haskell网站上看到了这个link on cyclic structures

有一个例子

cyclic = let x = 0 : y
         y = 1 : x
     in  x

我尝试以循环方式为我的问题定义列表,但无法成功。 我想要的是一个按照自身定义的列表,并在Hasekll中评估为[1 ..]。

注意:Haskell [1..]评估为[1,2,3,4,5...]而不评估为[1,1,1...]

2 个答案:

答案 0 :(得分:10)

以下内容可为您提供所需的结果:

nats = 1 : map (+1) nats

或者,更具惯用性:

nats = iterate (+1) 1

通过使用等式推理,很容易看出为什么第一个代码段评估为[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...]

答案 1 :(得分:5)

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

1
1 + 1
1 + 1 + 1
1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

每次输入后,每个后续条目都有一个额外的+ 1。因此,我们希望从1开始,然后将1添加到每个后续元素。然后我们想要获取第二个元素并在之后的所有内容中添加1

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

let xs = 1 : map (+ 1) xs

这扩展如下:

1 : map (+ 1) xs
1 : (1 + 1) : map (+ 1) xs
1 : (1 + 1) : ((1 + 1) + 1) : map (+ 1) xs

等等。