Haskell无限循环,简单地重新放行动

时间:2012-03-22 00:36:06

标签: haskell loops infinite

我有这样的代码:

Prelude> let n = [1,2,3,4]
Prelude> n
[1,2,3,4]
Prelude> 0:n
[0,1,2,3,4]
Prelude> let n = 0:n

当我在上层后输入Haskell解释器时:

Prelude> n

我得到了无限的结果:

[0,0,0,0,0,0,0,0,0

打印“0”的地方是无限的。

为什么我会得到这样的结果?
是否有一些递归的东西,为什么/它如何在解释器级别工作?
我可以抓住堆栈溢出,GHCi上的这些东西是不是?

谢谢,
最诚挚的问候!

3 个答案:

答案 0 :(得分:8)

n的新绑定会影响旧绑定。您不会重新分配Haskell中的变量。

答案 1 :(得分:7)

Josh所说的是你对n的定义扩展为:

0:n.  -- note n still equals 0:n, just like you said
0:0:n. -- note n _still_ equals 0:n
0:0:0:n
...

答案 2 :(得分:1)

Haskell的let与其他语言(如ML)中的letrec类似:允许绑定是递归的。换句话说,n = 0:nn定义为第一个元素为0且列表的其余部分等于n的列表。这意味着n的第二个元素等于n的第一个元素,即0等。

由于懒惰,无限列表在Haskell中是可以的。如果您只使用列表的前10个元素,则永远不会评估第11个元素及其后的元素。