【问题标题】:How would you (re)implement iterate in Haskell?你将如何(重新)在 Haskell 中实现迭代?
【发布时间】:2010-09-22 13:34:52
【问题描述】:
iterate :: (a -> a) -> a -> [a]

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

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

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

(这里是 Haskell 初学者)

【问题讨论】:

    标签: haskell loops combinators


    【解决方案1】:

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

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

    由于惰性求值,只有计算函数值所需的构造列表部分将被求值。

    【讨论】:

    • 这看起来像是“fix”定义“fix f = f (fix f)”的变体,类似于 ...“iterate f (f a)”,您可以使用 fix 来定义迭代: “迭代 f a = fix (\r x -> x:r (f x) ) a” 并不是说​​它更好,只是想 id 说:)
    【解决方案2】:

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

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

    我记得很早之前读到的瞬间:data Bool = False | True

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多