Haskell:“<function name =”“>”......?</function>的多个声明

时间:2013-09-01 22:29:32

标签: haskell

嘿伙计们,所以这里是我的代码,我得到了“镜像的多重声明”的奇怪错误。我之前有其他功能,但没有一个被命名为镜像......有什么想法吗?

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

4 个答案:

答案 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行。