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

时间:2012-08-10 13:13:09

标签: haskell scope let letrec

运行此代码:

j = let x = 4
    in let x = x * x
       in x
解释器中的

ghci> j
... no response ...

以很少的CPU利用率挂起。为什么是这样?我期待j = 16

1 个答案:

答案 0 :(得分:16)

根据Haskell报告,section 3.12

  

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

(强调我的)

所以在第二个letx = x * x,所有x引用相同的绑定, none 引用外x = 4捆绑。