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

时间:2010-09-22 13:34:53

标签: haskell loops combinators

iterate :: (a -> a) -> a -> [a]

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

Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude> 

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

(Haskell初学者)

2 个答案:

答案 0 :(得分:23)

好吧, iterate 构造一个无限的值列表 a ,增加 f 。因此,我首先编写一个函数,将一些值 a 添加到通过使用 f a 递归调用iterate构建的列表中:

iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)

由于延迟评估,将只评估计算我的函数值所需的构造列表部分。

答案 1 :(得分:13)

另请注意,您可以在报告的Standard Prelude中找到有关基本Haskell函数范围的简明定义。

通过这个简单的定义列表来阅读基本上从原始基元中引导丰富库的定义可以非常有教育意义,并且可以为“haskell方式”提供一个窗口。

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