Haskell 中的范围问题

Scoping issue in Haskell

我写了一个简单的程序来尝试理解 Haskell 中的作用域规则:

myfunc =
let x = 4 in
let x = x + 1 in
x

调用时,此函数将延迟计算第 4 行的 x,然后我们注意到它尝试在第三行计算 x,然后尝试在第三行再次计算 x,创建一个无穷大环形。如何在不重命名第三行 x + 1 中的 x 的情况下解决此问题?

你不能。在 Haskell 中使用 = 引入的所有绑定都是递归的。 (其他语言有时确实提供非递归绑定形式,但 Haskell 不提供。)

你可以这样做

myfunc = do
    x <- Identity 4
    x <- Identity (x+1)
    Identity x

...但在这一点上,只需将 x 重命名为 x' 或者就所需的手指输入量而言看起来非常有吸引力。

P.S。调用这个 myfunc 有点奇怪——它不是一个函数!