2013-02-13 93 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條件。