我有一个功能,可以在haskell中成功编译。
看起来像这样:
suffix :: Int -> String
suffix i
| i==0 = "th"
| i==1 = "st"
| i==2 = "nd"
| i==3 = "rd"
| i>=4 || i<=9 = "th"
| i<0 = error "Must be positive integer" ----------NOT WORKING?
| otherwise = suffix(i `rem` 10)
我至少可以告诉i<0
后卫的错误行,这是行不通的。当我进入GHCI并在一个数字中添加一个“ - ”:suffix -5
如果我完全离开这个案例,我会得到同样的错误信息。
我希望它能够显示我的错误信息。希望有人能发现我的问题。谢谢!
答案 0 :(得分:9)
基本的Haskell语法怪异。这是语言中唯一的情况。
suffix -5
suffix - 5
是(-) suffix 5
。 -
字符被视为中缀二进制运算符,就像haskell中所有标点符号命名的函数一样。也就是说,除非-
之前的表达式中没有字符。做你想做的最简单的方法是使用suffix (-5)
。通过将其包含在parens中,您在语法上将其设置为独立表达式,这意味着表达式中-
之前没有任何字符。
这会产生自己的奇怪之处,因为你不能创建一个操作符部分来从输入中减去一个值。 (-5)
不是意味着\x -> x - 5
的部分,与该语言中的任何其他二元运算符不同。这是一种不幸的情况,一元否定和二元减法使用相同的符号,因为这意味着在Haskell的语法中必须存在这样的极端情况。
答案 1 :(得分:3)
当您编写被解释为“从后缀中减去5”的suffix -5
时,即它认为您正在尝试将二元运算符-
应用于参数suffix
和{{ 1}}。当然,这不起作用,因为你不能从函数中减去一个数字。
如果你写5
,它会正常工作。
答案 2 :(得分:0)
Haskell守卫从上到下匹配。 i < 0
条件永远不会匹配,因为只要i
小于零,它就会首先与其上方的i >= 4 || i <= 9
条件匹配。