您(重新)如何在Haskell中实施迭代?
-
04-10-2019 - |
题
iterate :: (a -> a) -> a -> [a]
(您可能知道) iterate
是具有函数和启动值的函数。然后,它将函数应用于起始值,然后将相同的函数应用于最后一个结果,依此类推。
Prelude> take 5 $ iterate (^2) 2
[2,4,16,256,65536]
Prelude>
结果是无限列表。 (这就是为什么我使用 take
)。我的问题您将如何实施自己的 iterate'
在Haskell中的功能,仅使用基础知识((:)
(++)
lambdas,模式马切,后卫等)?
(Haskell初学者在这里)
解决方案
好, 迭代 构建无限的价值列表 一种 递增 F. 。因此,我将首先编写一个验证一些值的函数 一种 通过递归调用迭代构建的列表 F A:
iterate :: (a -> a) -> a -> [a]
iterate f a = a : iterate f (f a)
得益于懒惰的评估,仅评估计算我功能值所需的构建列表的一部分。
其他提示
另请注意,您可以在报告的基本Haskell功能范围内找到简明的定义 标准前奏.
读取此简单定义的清单,基本上是从原始原始图中引导丰富的图书馆的列表,就可以提供“ Haskell Way”的窗口,可以非常具有教育意义和大开眼界。
我记得很早就阅读了: data Bool = False | True
.
不隶属于 StackOverflow