dan*_*tin 3 haskell list collatz
我是Haskell的新手,也是一般的编程.我试图定义一个从n生成Collatz数字序列的函数.我有:
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)
在正确的Collatz序列之后产生无限的"1"序列; 然而,
collatz' n = (takeWhile (>1) (collatz'' n))
Run Code Online (Sandbox Code Playgroud)
从n生成除"1"之外的所有Collatz数字.我究竟做错了什么?
(:) :: 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
ony的答案是正确的,但既然你是Haskell的新手,也许这是一个更清晰的解释.在:操作前暂时搁置的值到一个列表,这样做somelist : 7因为这是试图无效AP挂起一个值的列表.这就是为什么(collatz' n) : 1不编译,因为类型(collatz' n)是一个数字列表.
尝试替换: 1使用++ [1].
| 归档时间: |
|
| 查看次数: |
1496 次 |
| 最近记录: |