Haskell 为什么这段代码会使用阴影`let`绑定挂起?

Haskell 为什么这段代码会使用阴影`let`绑定挂起?,haskell,scope,let,letrec,Haskell,Scope,Let,Letrec,运行此代码: j = let x = 4 in let x = x * x in x 在口译员中: ghci> j ... no response ... 挂起时CPU利用率非常低。为什么会这样?根据哈斯克尔报告,我预计j=16 Let表达式在e中具有一般形式Let{d1;…;dn},并引入嵌套的、词典范围的、相互递归的声明列表(Let在其他语言中通常称为letrec)。声明的范围是表达式e和声明的右侧 (强调矿山) 因此,在第二个let,其中x=x*x,所有xs

运行此代码:

j = let x = 4
    in let x = x * x
       in x
在口译员中:

ghci> j
... no response ...

挂起时CPU利用率非常低。为什么会这样?根据哈斯克尔报告,我预计j=16

Let表达式在e中具有一般形式Let{d1;…;dn},并引入嵌套的、词典范围的、相互递归的声明列表(Let在其他语言中通常称为letrec)。声明的范围是表达式e和声明的右侧

(强调矿山)

因此,在第二个
let
,其中
x=x*x
,所有
x
s都指向相同的绑定,没有一个指向外部
x=4
绑定