Haskell模式匹配失败的负数

Ari*_*ion 18 haskell functional-programming function pattern-matching

Haskell编译器在以下函数上引发错误:

balancedMax :: Int -> Int -> Int
balancedMax -1 _ = -1
balancedMax _ -1 = -1
balancedMax a b = max a b
Run Code Online (Sandbox Code Playgroud)

翻转标志可以解决问题:

balancedMax :: Int -> Int -> Int
balancedMax 1 _ = -1
balancedMax _ 1 = -1
balancedMax a b = max a b
Run Code Online (Sandbox Code Playgroud)

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

ham*_*mar 31

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

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

balancedMax :: Int -> Int -> Int
balancedMax (-1) _ = -1
balancedMax _ (-1) = -1
balancedMax a b = max a b
Run Code Online (Sandbox Code Playgroud)

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


7st*_*tud 6

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

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

(-) f 1 = ....
Run Code Online (Sandbox Code Playgroud)

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

somefunc x 1 = x + 1
Run Code Online (Sandbox Code Playgroud)

这恰好相当于定义somefunc(),如下所示:

x `somefunc` 1 = x + 1
Run Code Online (Sandbox Code Playgroud)

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

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