Haskell中的错误功能

时间:2013-02-13 01:50:33

标签: 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                  = error "Must be positive integer"     ----------NOT WORKING?
   | otherwise            = suffix(i `rem` 10)      

我至少可以告诉i<0后卫的错误行,这是行不通的。当我进入GHCI并在一个数字中添加一个“ - ”:suffix -5如果我完全离开这个案例,我会得到同样的错误信息。

我希望它能够显示我的错误信息。希望有人能发现我的问题。谢谢!

3 个答案:

答案 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条件匹配。