如何模仿懒惰

时间:2011-06-14 00:59:55

标签: haskell language-agnostic programming-languages erlang lazy-evaluation

我正在看John Hughes的采访,当他从Haskell转到Erlang时,他被问到是否错过了懒惰。作为答案,他说是,他用工具“模仿”它。 我的问题是:如何用严格的语言模仿懒惰?很高兴在主流语言中看到冷却的例子。

3 个答案:

答案 0 :(得分:7)

通常的诀窍是使用lambda(我想在Erlang中会fun)。

以下是使用Ruby的示例:

Monad equivalent in Ruby

基本思想非常简单......你可以使用任何你想要变性的表达式,将它包装在零参数匿名函数中,然后在你想强制它时评估该函数。

答案 1 :(得分:2)

如果您只想模拟非严格性,那么您只需要将表达式包装到函数中并在需要时调用它。

如果你真的想模仿懒惰(即记忆中的非严格性),那么你需要将该函数包装成一个可变引用。在OCaml中绘制草图(忽略异常):

type 'a lazy = 'a thunk ref
and 'a thunk = Lazy of unit -> 'a | Memo of 'a

let lazy f = ref (Lazy f)
let force l = match !l with
  | Lazy f -> let x = f () in l := Memo x; x
  | Memo x -> x

除了OCaml已经在其库中预定义了这种预定义(以同样处理f的异常的方式)。

答案 2 :(得分:1)

您可能希望详细了解python生成器。

简而言之,这些是具有__next__消息的对象,允许它们生成一个项目。因此,它们可以组合,以便每个步骤的处理从下一个组合的生成器中提取项目。

通过这种方式,python程序员可以轻松使用无限序列(或长度为1的序列)。