我是Haskell的新手,並且一般編程。我試圖定義一個函數,它可以從n生成Collatz數字的序列。我有:錯誤「Collatz函數中沒有(Num [t])」的實例
collatz n = (collatz' n) : 1
where collatz' n = (takeWhile (>1) (collatz'' n))
where collatz'' n = n : collatz'' (collatz''' n)
where collatz''' 1 = 1
collatz''' n = if (even n) then (div n 2) else ((3*2)+1)
當我在GHCI運行此,我得到的錯誤:
No instance for (Num [t])
arising from the literal `2' at <interactive>:1:7
Possible fix: add an instance declaration for (Num [t])
我不知道這意味着什麼。問題似乎在列表中追加「1」。出現此問題的原因是因爲
collatz' n = (takeWhile (>0) (collatz'' n))
在正確的Collatz序列之後生成無限序列的「1」然而,
collatz' n = (takeWhile (>1) (collatz'' n))
從Ñ生成除 「1」 在Collatz號碼。我究竟做錯了什麼?
'(collatz'n):[]'很好。它會產生類似於[[a]]的東西(實際上原始的例子是編譯的,但是對於第一個參數'a'沒有類型綁定可以滿足類限制:'collatz ::(Integral a,Num [[a] ])=> a - > [[a]]')。問題是任何數字(即'1')只能編譯成滿足類「數字a」的數據值。 – ony 2010-07-02 07:01:54
也謝謝:爲了強制(:)工作,我已經重寫了以前的所有函數。你爲我節省了很多時間! – danportin 2010-07-02 07:04:14