2014-09-02 34 views
1

我有一個簡單的功能,併產生得到一個編譯錯誤,如下列:沒有實例(NUM整數),從字面'0'

fac::[int] -> int 
fac [] = 0 
fac (x:[]) = x 
fac ([xs]) = sum [xs] 

編譯錯誤:

No instance for (Num int) arising from the literal `0' 
    Possible fix: 
     add (Num int) to the context of 
     the type signature for fac :: [int] -> int 
    In the expression: 0 
    In an equation for `fac': fac [] = 0 

是什麼代碼錯誤?

回答

5

首先,你需要輸入大寫字母Int

fac :: [Int] ->Int

接下來,您的模式重疊。與[xs]匹配的任何內容也匹配x:[],反之亦然。它看起來像你想要匹配

fac xs = sum xs 

...只有這只是使fac = sum

11

類型簽名是錯誤的。 int(小寫字母i)是一個「類型變量」,這意味着這個函數對於任何類型[sometype] -> sometype都應該是多態的。相反,您可能需要Int(大寫I),它是指位長度的有符號整數,取決於您的編譯器和平臺。

另一個問題,一個常見的錯誤是最後一個模式永遠不會匹配,因爲它指定了一個元素的列表。即,x:[]是名稱爲x的元素列表。類似地,[xs]是單個元素列表(句法糖爲xs:[]),其中xs被綁定到一個元素。

1

只需添加其他答案的一件事:如果您實際上想要fac適用於所有數字類型,則可以按照錯誤消息的建議將Num約束添加到類型簽名。在這種情況下,最好使用不易混淆的類型變量:int

fac :: Num a => [a] -> a 
相關問題