Haskell模式匹配失败的负数

时间:2013-06-07 05:01:16

标签: function haskell functional-programming pattern-matching

Haskell编译器在以下函数上抛出错误:

balancedMax :: Int -> Int -> Int
balancedMax -1 _ = -1
balancedMax _ -1 = -1
balancedMax a b = max a b

翻转标志可以解决问题:

balancedMax :: Int -> Int -> Int
balancedMax 1 _ = -1
balancedMax _ 1 = -1
balancedMax a b = max a b

为什么模式匹配在底片上失败,什么是干净的解决方法?

2 个答案:

答案 0 :(得分:31)

它失败了,因为它认为你正在尝试重新定义减号运算符,因为f -1 = ...被解析为f - 1 = ...

要解决此问题,您只需添加括号:

balancedMax :: Int -> Int -> Int
balancedMax (-1) _ = -1
balancedMax _ (-1) = -1
balancedMax a b = max a b

同样的事情发生在表达式中。要使用否定文字调用balancedMax,您也需要使用括号。

答案 1 :(得分:6)

  

因为f -1 = ...被解析为f - 1 = ....

如果你不知道,那意味着同样的事情:

(-) f 1 = ....

类似于定义这样的函数:

somefunc x 1 = x + 1

这恰好等同于定义somefunc():

x `somefunc` 1 = x + 1

只有使用( - )时,在中缀位置使用它时,不必编写反引号,即位于两个参数之间。

我看过的这两本开头的哈斯克尔书籍早就警告过你,一元 - 需要与括号一起使用,例如: (-3)。