Haskell中的误差函数

Haskell中的误差函数,haskell,error-handling,Haskell,Error Handling,我有一个在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

我有一个在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)      
后缀::Int->String
后缀i
|i==0=“th”
|i==1=“st”
|i==2=“nd”
|i==3=“rd”

|i>=4 | i当您编写解释为“从后缀中减去5”的
后缀-5
时,即它认为您试图将二进制运算符
-
应用于参数
后缀
5
。当然,这是行不通的,因为你不能从一个函数中减去一个数字


如果您编写
后缀(-5)
,它可以正常工作。

基本Haskell语法古怪。这是语言中唯一类似的情况

后缀-5
后缀-5
(-)后缀5
-
字符被视为中缀二进制运算符,就像haskell中所有标点命名函数一样。也就是说,除非表达式中
-
前面没有字符。最简单的方法是使用后缀(-5)
。通过将其包含在parens中,可以使其在语法上成为一个独立的表达式,这意味着表达式中的
-
前面没有字符


不过,这也造成了它自己的奇怪之处,因为您无法创建用于从输入中减去值的运算符部分
(-5)
不是表示
\x->x-5
的部分,这与该语言中的任何其他二进制运算符不同。一元否定和二元减法使用同一个符号,这是一种不幸的情况,因为这意味着在Haskell的语法中必须有这样的角情况。

Haskell保护自上而下匹配。
i<0
条件永远不会匹配,因为只要
i
小于零,它就会首先匹配
i>=4 | | i@ZAX,它不会跳到
,否则它会直接进入
i>=4 | | iYou可以通过正确查看错误消息来找出这一点:这是编译器错误,在“it”的等式中,
:it=suffix-5
非常清楚地表明问题与
f-5
被解析为
f-5
有关。