首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Lazy.from_fun和Lazy.from_val

Lazy.from_fun和Lazy.from_val
EN

Stack Overflow用户
提问于 2014-11-13 08:48:34
回答 1查看 81关注 0票数 1

我只是对Lazy中的这两个函数感到好奇。

Lazy.from_fun

从医生那里:

代码语言:javascript
复制
val from_fun : (unit -> 'a) -> 'a t 

from_fun f is the same as lazy (f()) but slightly more efficient.

然后我看了一下消息来源

代码语言:javascript
复制
let from_fun (f : unit -> 'arg) =
  let x = Obj.new_block Obj.lazy_tag 1 in
  Obj.set_field x 0 (Obj.repr f);
  (Obj.obj x : 'arg t)

我猜Obj是用来直接为from_fun分配内存的。但是为什么它能提高效率呢?或者Lazy.from_funlazy (f())的区别是什么?

Lazy.from_val

代码语言:javascript
复制
val from_val : 'a -> 'a t

from_val v returns an already-forced suspension of v. 
This is for special purposes only and should not be confused with lazy (v).

我真的不明白这些。对我来说,Lazy.from_val 5lazy(5)都返回具体值为5的int lazy.t。为什么Lazy.from_val是用于特殊目的的?又有什么特殊目的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 09:43:37

这只是我的猜测:让我们比较以下几点:

代码语言:javascript
复制
let z1 = lazy (print_newline ())
let z2 = Lazy.from_fun print_newline

使用ocamlc -dlambda

代码语言:javascript
复制
(setglobal Lz!
  (let
    (z1/1008 =
       (makemutable 246
         (function param/1012 (apply (field 31 (global Pervasives!)) 0a)))
     z2/1009 =
       (apply (field 2 (global Lazy!)) (field 31 (global Pervasives!))))
    (makeblock 0 z1/1008 z2/1009)))

z1是从代码function param/1012 -> Pervasives.print_newline ()的函数创建的懒惰值,而z2是直接从Pervasives.print_newline创建的。由于额外的lambda抽象,z1可能有点效率低下。

正如文档所述,Lazy.from_val只是从一个已经计算过的值中创建一个惰性值,而不需要任何暂停。您可以通过尝试Lazy.from_val (print_string "hello")lazy (print_string "hello")来检查它。前者立即打印hello,但后者不打印。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26904655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档