GHCI终端无响应问题:Haskell重复定义变量为何未报错?
为什么Haskell重复定义
x会让GHCI无响应而非报错? 这是Haskell的惰性求值特性和GHCI交互模式的规则共同导致的:
- 首先,Haskell允许同一作用域内重复定义同名变量,后面的定义会覆盖前面的。但你写的第二行
x = x+1里,x引用的是它自己(因为后面的定义已经覆盖了之前的x=30),这就形成了无限递归的定义。 - Haskell的惰性求值不会立刻计算变量的值,只有当实际需要用到这个值的时候才会触发计算。但在GHCI的交互模式下,当你输入完这两行代码后,它会尝试自动打印最后一个绑定的变量(也就是这个递归的
x),这时候就会触发无限递归的计算循环,导致终端卡住,只能用Ctrl+C中断。
如果是把这段代码写在.hs文件里编译,编译器通常会检测到这种无限递归并给出警告,但GHCI作为即时交互环境,不会提前做这种检测,只会在求值时陷入循环。
比如你分两步输入:先输x = 30,再输x = x+1,这时候GHCI不会卡住,直到你输入x来查看它的值,才会触发无限递归导致无响应;但一次性输入两行的话,GHCI会自动尝试求值最后一个变量,所以立刻就卡住了。
内容的提问来源于stack exchange,提问作者Akash Arjun
相关产品推荐
相关产品推荐

