我正在看John Hughes的采访,当他从Haskell转到Erlang时,他被问到是否错过了懒惰。作为答案,他说是,他用工具“模仿”它。 我的问题是:如何用严格的语言模仿懒惰?很高兴在主流语言中看到冷却的例子。
答案 0 :(得分:7)
通常的诀窍是使用lambda
(我想在Erlang中会fun
)。
以下是使用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的序列)。