2013-02-13 90 views
0

我有一个在haskell中编译成功的函数。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

您可以通过正确查看错误消息来了解这一点:它是一个_compiler error_,并且在'it'的等式中:it = suffix-5'很清楚地表明问题与' f-5'被解析为'f-5'。 – leftaroundabout 2013-02-14 10:55:02

回答

9

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

suffix -5suffix - 5(-) suffix 5-字符被视为中缀二元运算符,就像Haskell中所有标点符号函数一样。也就是说,除非-之前的表达式中没有字符。最简单的做法是用suffix (-5)。通过将它包含在parens中,可以使其在句法上成为独立表达式,这意味着表达式中的-之前没有字符。

尽管如此,您还是无法创建一个用于从输入中减去一个值的运算符部分,这会产生它自己的奇怪现象。 (-5)不是代表\x -> x - 5的部分,不像该语言中的任何其他二进制运算符。这是一种不幸的情况,一元否定和二进制减法使用相同的符号,因为这意味着在Haskell的语法中必须存在这样的角落案例。

3

当你写suffix -5被解释为“减去5从后缀”,即它认为你想二元运算-适用于参数suffix5。当然,这是行不通的,因为你不能从一个函数中减去一个数字。

如果你写suffix (-5),它会正常工作。

+2

@ZAX它不会跳到'otherwise'的情况,它直接进入'i> = 4 ||因为'-5'确实小于9,所以我认为你的意思是'||'是''&''。 – sepp2k 2013-02-13 02:10:38

0

哈斯克尔卫兵匹配从上到下。 i < 0条件将永远不匹配,因为每当i小于零时,它将首先匹配上面的i >= 4 || i <= 9条件。