嘿伙计们,所以这里是我的代码,我得到了“镜像的多重声明”的奇怪错误。我之前有其他功能,但没有一个被命名为镜像......有什么想法吗?
mirror :: BinTree a -> BinTree a
mirror = undefined
mirror (Node tL x tR) = Node x mirror tR mirror tL
答案 0 :(得分:10)
函数的多个定义必须具有相等数量的等号左边的参数。从理论的角度来看,这不是必需的(注意:其中一个定义肯定可以是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
答案 1 :(得分:1)
这不是这个具体例子的问题,但由于这是 Google 上关于“多重定义 Haskell”的第一个结果,我想我应该贡献一下对我来说是什么问题:
如果您使用带有某些参数的模式匹配多次定义函数,则所有定义必须是连续的。如果它们之间有其他代码,则将它们视为单独的定义。
示例:以下无效,因为 b
的定义将 a
的定义分开:
frobnicate :: Bool -> String
frobnicate True = "foo"
b = "bar"
frobnicate False = b
答案 2 :(得分:0)
第2行和第3行有相互冲突的类型:您已将mirror
定义为常量undefined
,然后尝试将其定义为单参数函数。删除第2行应该解决问题;它不清楚为什么你首先写它。
答案 3 :(得分:0)
mirror
的定义存在冲突。第一个条款,
mirror = undefined
是一个全能型,因此编译器认为该定义已完成。然后考虑下一个子句开始一个新的定义。您应该删除undefined
行。