【发布时间】: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
大家好,这是我的代码,在上面我得到了“镜像的多重声明”的奇怪错误。在此之前我还有其他功能,但没有一个被命名为镜像...有什么想法吗?
mirror :: BinTree a -> BinTree a
mirror = undefined
mirror (Node tL x tR) = Node x mirror tR mirror tL
【问题讨论】:
标签: haskell
一个函数的多个定义必须在等号左边有相同数量的参数。从理论的角度来看,这不是必需的(注意:其中一个定义当然可以是 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
【讨论】:
undefined 通常用作占位符,因为它允许在放入另一种情况之前对其余代码进行类型检查 - 在这种情况下是某种Bin 或Nil 构造函数的情况。
这不是这个特定示例的问题,但由于这是 Google 上“多个定义 Haskell”的第一个结果,我想我应该贡献我的问题所在:
如果您使用模式匹配与某些参数多次定义函数,则所有定义必须是连续的。如果它们之间有其他代码,则它们被视为单独的定义。
示例:以下是无效的,因为b的定义除以a的定义:
frobnicate :: Bool -> String
frobnicate True = "foo"
b = "bar"
frobnicate False = b
【讨论】:
第 2 行和第 3 行有冲突的类型:您已将 mirror 定义为常量 undefined,然后尝试将其定义为单参数函数。删除第 2 行应该可以解决问题;不清楚你为什么写它。
【讨论】:
undefined 的类型为 a,可匹配任何其他类型。
a -> b 类型,即单参数函数。
您对 mirror 的定义存在冲突。第一个子句,
mirror = undefined
是一个包罗万象的定义,因此编译器认为定义已完成。然后考虑下一个子句开始一个新的定义。您应该删除 undefined 行。
【讨论】:
undefined 可能是为了在确保程序编译的同时发出“填充”信号。您必须将其删除才能获得工作程序。