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
为什么模式匹配在底片上失败,什么是干净的解决方法?
答案 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)。