18

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

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

4

2 回答 2

33

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

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

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

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

于 2013-06-07T05:05:54.113 回答
7

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

如果您不知道,则与以下内容相同:

(-) f 1 = ....

这类似于定义这样的函数:

somefunc x 1 = x + 1

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

x `somefunc` 1 = x + 1

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

我看过的两本开始的haskell书籍都在早期警告你一元 - 需要与括号一起使用,例如(-3)。

于 2013-06-07T08:59:39.363 回答