运行此代码:
j = let x = 4
in let x = x * x
in x
在解释器中:
ghci> j
... no response ...
挂起时 CPU 利用率非常低。 这是为什么呢? 我期待j = 16
.
根据Haskell报告,第3.12节:
让表达式在 e 中具有一般形式 let { d1 ; ... ; dn },并引入一个嵌套的、词法范围的、相互递归的声明列表(let 在其他语言中通常称为 letrec)。声明的范围是表达式 e 和声明的右侧。
(强调我的)
所以在第二let
中,x = x * x
,所有x
都指同一个绑定,没有一个引用外x = 4
绑定。