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
使用否定文字进行调用,您也需要使用括号.
因为
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).