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