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

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

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

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

(这里是 Haskell 初学者)

4

2 回答 2

28

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

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

由于惰性评估,只有计算我的函数值所需的构造列表部分才会被评估。

于 2010-09-22T13:42:17.800 回答
15

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

通读这个简单的定义列表,这些定义基本上从原始原语中引导出一个丰富的库,就为“haskell 方式”提供一个窗口而言,这可能是非常有教育意义的和大开眼界的。

我记得很早的时候阅读:data Bool = False | True

于 2010-09-22T14:46:44.153 回答