2011-06-03 71 views
6

http://en.wikibooks.org/wiki/Haskell/Beginning「無實例」 錯誤

Prelude> let abs x = if x < 0 then -x else x 
Prelude> abs 5 
5 
Prelude> abs -3 

<interactive>:1:6: 
    No instance for (Num (a0 -> a0)) 
     arising from the literal `3' 
    Possible fix: add an instance declaration for (Num (a0 -> a0)) 
    In the second argument of `(-)', namely `3' 
    In the expression: abs - 3 
    In an equation for `it': it = abs - 3 

什麼是錯的例子嗎?

+2

錯誤信息的解釋,僅供將來參考:'a0 - > a0'是'abs'的類型。 (在你的ghci中鍵入':t abs'來查看它。)錯誤信息是說這個類型'a0 - > a0'不是'Num'類的一個實例,因爲只有'Num'可以被減去而且在任何情況下'3'都表示第一個參數必須是'Num'中的某種類型。 (在ghci類型':t( - )'和':t 3'中查看發生了什麼。)\'( - )'的第二個參數,即\'3'「中的行最具啓發性:表明'-'被視爲帶* 2 *參數的中綴運算符,而不是一元減號。 – ShreevatsaR 2011-06-03 07:52:33

回答

14

Haskell認爲你想從abs減去3,並且抱怨abs不是數字。您需要使用一元反運算符時添加括號:

abs (-3) 
+0

打我吧:) – 2011-06-03 07:30:14

+0

乾杯。這些Wikibooks文檔似乎在幾個地方有所不同。 – zaf 2011-06-12 13:05:40

5

的解釋認爲你的意思是不是abs - 3abs (-3)。您需要使用括號來消除代碼的歧義,並確保明確您打算使用一元「 - 」函數,而不是減法運算符。