元组声明进入无限循环
Tuple declaration goes to infinite loop
在 Prelude 中尝试这个
Prelude> (i, j) = (3, 4)
Prelude> (i, j) = (j, i)
Prelude> i
我原以为 4
,但我得到了一个无限循环
为什么?
如何以简洁优雅的方式做到这一点?
我能想到的最短序列是这样的:
(i', j') = (i, j)
(i, j) = (j', i')
这当然只对GHCi有效,就像原始序列一样。在正常的 Haskell 模块中,这样的定义不能出现在相同的词法范围内。
如果你定义
ghci> factorial n = if n == 0 then 1 else n * (factorial (n - 1))
您希望 factorial
在 RHS 上的使用与在 LHS 上的 factorial
相同,对吗?
同理,以下定义 i
和 j
本身:
ghci> (i,j) = (j,i)
您可以使用 GHCi 在隐式 IO do 块中运行的属性,并且 do 绑定中的变量不在其右侧的范围内:
(i, j) <- return (j, i)
但是,如果您启用了 -Wname-shadowing(包括通过 -Wall),您会收到来自 -Wname-shadowing 的警告。
在 Prelude 中尝试这个
Prelude> (i, j) = (3, 4)
Prelude> (i, j) = (j, i)
Prelude> i
我原以为 4
,但我得到了一个无限循环
为什么?
如何以简洁优雅的方式做到这一点?
我能想到的最短序列是这样的:
(i', j') = (i, j)
(i, j) = (j', i')
这当然只对GHCi有效,就像原始序列一样。在正常的 Haskell 模块中,这样的定义不能出现在相同的词法范围内。
如果你定义
ghci> factorial n = if n == 0 then 1 else n * (factorial (n - 1))
您希望 factorial
在 RHS 上的使用与在 LHS 上的 factorial
相同,对吗?
同理,以下定义 i
和 j
本身:
ghci> (i,j) = (j,i)
您可以使用 GHCi 在隐式 IO do 块中运行的属性,并且 do 绑定中的变量不在其右侧的范围内:
(i, j) <- return (j, i)
但是,如果您启用了 -Wname-shadowing(包括通过 -Wall),您会收到来自 -Wname-shadowing 的警告。