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
有点奇怪——它不是一个函数!
我写了一个简单的程序来尝试理解 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
有点奇怪——它不是一个函数!