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)      

i<0我至少可以通过警卫的错误行来判断它是行不通的。当我进入 GHCI 并在数字上添加“-”时:suffix -5如果我完全关闭此案例,我会收到相同的错误消息。

我希望它清楚地显示我的错误消息。希望有人能发现我的问题。谢谢!

4

3 回答 3

9

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

suffix -5是。suffix - 5_ (-) suffix 5-字符被视为中缀二元运算符,就像 haskell 中所有以标点符号命名的函数一样。也就是说,除非 . 之前的表达式中没有字符-。做你想做的最简单的方法是使用suffix (-5). 通过将其括在括号中,您在语法上使其成为一个独立的表达式,这意味着表达式中没有字符在前面-

但是,这会产生其自身的怪异之处,因为您不能创建一个运算符部分来从输入中减去一个值。 与该语言中的任何其他二元运算符不同,(-5)不是表示 的部分。\x -> x - 5一元否定和二进制减法使用相同的符号是一种不幸的情况,因为这意味着在 Haskell 的语法中必须存在这样的极端情况。

于 2013-02-13T01:56:46.877 回答
3

当您将suffix -5其解释为“从后缀中减去 5”时,即认为您正在尝试将二元运算符-应用于参数suffix5. 当然那是行不通的,因为你不能从函数中减去一个数字。

如果你写suffix (-5),它会工作得很好。

于 2013-02-13T01:56:36.700 回答
0

Haskell 守卫从上到下匹配。i < 0条件永远不会匹配,因为只要i小于零,它就会首先匹配它上面的条件i >= 4 || i <= 9

于 2013-02-14T05:40:37.637 回答