有没有办法在 Haskell 中不使用从左到右构建列表++
?
cons
是一个恒定时间操作,我想保持代码高效。我觉得有一种通用的方法可以利用 Haskell 的懒惰来做这样的事情,但我想不出来。
现在我正在编写一个创建 Collatz 序列的函数,但它正在以错误的方向构建列表:
module CollatzSequence where
collatz :: (Integral a) => a -> [a] -> [a];
collatz n l
| n <= 0 = error "Enter a starting number > 0"
collatz n [] = collatz n [n]
collatz n l@(x:_)
| x == 1 = l
| even x = collatz n ((div x 2):l)
| otherwise = collatz n ((x*3 + 1):l)
在 GHCi 中:
*CollatzSequence> collatz 13 []
[1,2,4,8,16,5,10,20,40,13]