【问题标题】:Haskell : multiple declarations of "<function name>" ...?Haskell:“<函数名称>”的多个声明......?
【发布时间】:2021-04-03 00:24:20
【问题描述】:

大家好,这是我的代码,在上面我得到了“镜像的多重声明”的奇怪错误。在此之前我还有其他功能,但没有一个被命名为镜像...有什么想法吗?

mirror :: BinTree a -> BinTree a
mirror = undefined
mirror (Node tL x tR) = Node x mirror tR mirror tL

【问题讨论】:

    标签: haskell


    【解决方案1】:

    一个函数的多个定义必须在等号左边有相同数量的参数。从理论的角度来看,这不是必需的(注意:其中一个定义当然可以是 lambda 或返回另一个函数),但人们似乎喜欢它,因为这样的定义通常表明存在错误。

    具体来说,你有一个零参数的定义:

    mirror = undefined
    

    一个定义,一个参数:

    mirror (Node tL x tR) = Node x mirror tR mirror tL
    

    你可能想要:

    mirror _              = undefined
    mirror (Node tL x tR) = Node x mirror tR mirror tL
    

    【讨论】:

    • 他很想交换顺序,因为模式匹配的解析顺序是从上到下的,不是吗?
    • @behklilr 我认为人们对实际代码的阅读过多。 undefined 通常用作占位符,因为它允许在放入另一种情况之前对其余代码进行类型检查 - 在这种情况下是某种BinNil 构造函数的情况。
    • 我实际上删除了未定义的。没有阅读我的作业完全是我的错。未定义的被放置在那里以替换为实际内容...谢谢。
    【解决方案2】:

    这不是这个特定示例的问题,但由于这是 Google 上“多个定义 Haskell”的第一个结果,我想我应该贡献我的问题所在:

    如果您使用模式匹配与某些参数多次定义函数,则所有定义必须是连续的。如果它们之间有其他代码,则它们被视为单独的定义。

    示例:以下是无效的,因为b的定义除以a的定义:

    frobnicate :: Bool -> String
    frobnicate True = "foo"
    b = "bar"
    frobnicate False = b
    

    【讨论】:

      【解决方案3】:

      第 2 行和第 3 行有冲突的类型:您已将 mirror 定义为常量 undefined,然后尝试将其定义为单参数函数。删除第 2 行应该可以解决问题;不清楚你为什么写它。

      【讨论】:

      • 其实类型不是问题。 undefined 的类型为 a,可匹配任何其他类型。
      • 我认为说 undefined 是每个类型的成员更准确。这包括a -&gt; b 类型,即单参数函数。
      【解决方案4】:

      您对 mirror 的定义存在冲突。第一个子句,

      mirror = undefined
      

      是一个包罗万象的定义,因此编译器认为定义已完成。然后考虑下一个子句开始一个新的定义。您应该删除 undefined 行。

      【讨论】:

      • @GeorgiAngelov:undefined 可能是为了在确保程序编译的同时发出“填充”信号。您必须将其删除才能获得工作程序。
      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-07
      • 2017-07-08
      • 2013-04-26
      • 1970-01-01
      相关资源
      最近更新 更多