你将如何(重新)在Haskell中实现迭代?

And*_*anu 9 haskell loops combinators

iterate :: (a -> a) -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

(你可能知道)iterate是一个函数,它接受一个函数和起始值.然后它将函数应用于起始值,然后将相同的函数应用于最后的结果,依此类推.

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 
Run Code Online (Sandbox Code Playgroud)

结果是一个无限的列表.(这就是我使用的原因take).我的问题是如何iterate'在Haskell中实现自己的功能,只使用基础知识((:) (++)lambdas,模式mataching,警卫等)?

(Haskell初学者在这里)

dan*_*tin 23

那么,迭代构建值的无穷列表一个递增˚F.所以我会写,追加一定的价值函数开始一个由递归调用与迭代构建列表:

iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)
Run Code Online (Sandbox Code Playgroud)

由于延迟评估,将仅评估计算我的函数值所需的构造列表的那一部分.


scl*_*clv 13

另请注意,您可以在报告的标准前奏中找到有关基本Haskell函数范围的简明定义.

通过这个简单的定义列表来阅读基本上从原始基元中引导丰富的库可以是非常有教育意义的,并且在为"haskell方式"提供窗口方面令人大开眼界.

我记得在阅读时很早的一个时刻:data Bool = False | True.