我编写了一个简单的程序来试图理解Haskell中的作用域规则:
myfunc =
let x = 4 in
let x = x + 1 in
x
调用时,此函数将懒惰地评估第4行的x,然后我们注意到它尝试在第三行评估x,然后尝试在第三行再次计算x,从而创建无限循环。如何在不重命名第三行x + 1的x的情况下修复此问题?
答案 0 :(得分:2)
你不能。在Haskell中用=
引入的所有绑定都是递归的。 (其他语言有时会提供非递归绑定表单,但不提供Haskell。)
您可以执行类似
的操作myfunc = do
x <- Identity 4
x <- Identity (x+1)
Identity x
...但此时,只需将x
重命名为x'
,或者根据所需的手指输入数量看起来非常有吸引力。
P.S。调用此myfunc
有点奇怪 - 它不是函数!