代码之家  ›  专栏  ›  技术社区  ›  Santa Claus

元组声明进入无限循环

  •  2
  • Santa Claus  · 技术社区  · 7 年前

    在前奏中尝试

    Prelude> (i, j) = (3, 4)
    Prelude> (i, j) = (j, i)
    Prelude> i
    

    4 ,但我得到了一个无限循环

    为什么?

    如何以简洁优雅的方式做到这一点?

    3 回复  |  直到 7 年前
        1
  •  8
  •   Alec    7 年前

    如果你定义

    ghci> factorial n = if n == 0 then 1 else n * (factorial (n - 1))
    

    您希望使用 factorial 在RHS上相同 阶乘的 和LHS上的一样,对吗?

    同样,以下定义 i j 就其自身而言:

    ghci> (i,j) = (j,i)
    
        2
  •  3
  •   n. m. could be an AI    7 年前

    我能想到的最短序列是:

    (i', j') = (i, j)
    (i, j) = (j', i')
    

    当然,这只对GHCi有效,就像原始序列一样。在正常的Haskell模块中,此类定义不能出现在同一词汇范围内。

        3
  •  2
  •   Claude    7 年前

    您可以使用GHCi在隐式IO do块中运行的属性,以及do绑定中的变量不在其右侧的作用域中的属性:

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

    但是,如果启用了-Wname阴影(包括通过墙),您确实会收到来自-Wname阴影的警告。