8

运行此代码:

j = let x = 4
    in let x = x * x
       in x

在口译员中:

ghci> j
... no response ...

挂起时 CPU 使用率很低。为什么是这样?我预计j = 16

4

1 回答 1

16

根据 Haskell 报告,第 3.12 节

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

(强调我的)

所以在第二个letwhere 中x = x * x,所有x的 s 都指向同一个绑定,没有一个指向外部x = 4绑定。

于 2012-08-10T13:13:08.727 回答