错误"Collat​​z功能中没有(Num [t])的实例"

dan*_*tin 3 haskell list collatz

我是Haskell的新手,也是一般的编程.我试图定义一个从n生成Collat​​z数字序列的函数.我有:

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)
Run Code Online (Sandbox Code Playgroud)

当我在GHCi中运行它时,我收到错误:

No instance for (Num [t])
  arising from the literal `2' at <interactive>:1:7
Possible fix: add an instance declaration for (Num [t])
Run Code Online (Sandbox Code Playgroud)

我不知道这意味着什么.问题似乎是在列表中追加"1".出现这个问题是因为

collatz' n = (takeWhile (>0) (collatz'' n))
Run Code Online (Sandbox Code Playgroud)

在正确的Collat​​z序列之后产生无限的"1"序列; 然而,

collatz' n = (takeWhile (>1) (collatz'' n))
Run Code Online (Sandbox Code Playgroud)

n生成除"1"之外的所有Collat​​z数字.我究竟做错了什么?

ony*_*ony 6

(:) :: a -> [a] -> [a]
你的第一线collatz n = (collatz' n) : 1强迫1成为[a].
我想你想要的东西(collatz' n) ++ [1]
和你有错误if (even n) then (div n 2) else ((3*2)+1)应该有((3*n)+1或你喜欢的东西collatz''' 7 = 7


Jac*_*cob 5

ony的答案是正确的,但既然你是Haskell的新手,也许这是一个更清晰的解释.在:操作暂时搁置的值到一个列表,这样做somelist : 7因为这是试图无效AP挂起一个值的列表.这就是为什么(collatz' n) : 1不编译,因为类型(collatz' n)是一个数字列表.

尝试替换: 1使用++ [1].