我是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