如何模拟懒惰

| 我正在观看约翰·休斯的一次采访,他被问到从Haskell转到Erlang时是否想念懒惰。作为回答,他说是的,并且他使用工具来“模拟”它。 我的问题是:如何用一种严格的语言模仿懒惰?很高兴看到主流语言中的出色示例。     
已邀请:
        通常的技巧是使用
lambda
(我想在Erlang中将是
fun
)。 这是使用Ruby的示例: Ruby中的Monad等效项 基本思想很简单……您可以将要使其变得懒惰的任何表达式,将其包装在零参数匿名函数中,然后在想要强制使用该函数时对其求值。     
        如果只想模拟非严格性,那么您所要做的就是将一个表达式包装到一个函数中,并在需要时调用它。 如果您实际上想模拟懒惰(即具有备忘录的非严格性),则需要将该函数包装到可变引用中。在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中的异常的方式)。     
        您可能需要详细了解python生成器。 简而言之,这些是带有“ 3”信息的对象,使它们可以产生一项。这样,它们可以被组成,从而在每个步骤的处理都从下一个组成的生成器中提取一个项目。 这样,python程序员可以轻松地处理无限序列(或长度为一的序列)。     

要回复问题请先登录注册