我有这样的代码:
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上的这些东西是不是?
谢谢,
最诚挚的问候!
答案 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:n
将n
定义为第一个元素为0
且列表的其余部分等于n
的列表。这意味着n
的第二个元素等于n
的第一个元素,即0
等。
由于懒惰,无限列表在Haskell中是可以的。如果您只使用列表的前10个元素,则永远不会评估第11个元素及其后的元素。