元组声明进入无限循环

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 相同,对吗?

同理,以下定义 ij 本身:

ghci> (i,j) = (j,i)

您可以使用 GHCi 在隐式 IO do 块中运行的属性,并且 do 绑定中的变量不在其右侧的范围内:

(i, j) <- return (j, i)

但是,如果您启用了 -Wname-shadowing(包括通过 -Wall),您会收到来自 -Wname-shadowing 的警告。