我只是对Lazy中的这两个函数感到好奇。
Lazy.from_fun
从医生那里:
val from_fun : (unit -> 'a) -> 'a t 
from_fun f is the same as lazy (f()) but slightly more efficient.然后我看了一下消息来源
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_fun和lazy (f())的区别是什么?
Lazy.from_val
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 5和lazy(5)都返回具体值为5的int lazy.t。为什么Lazy.from_val是用于特殊目的的?又有什么特殊目的呢?
发布于 2014-11-13 09:43:37
这只是我的猜测:让我们比较以下几点:
let z1 = lazy (print_newline ())
let z2 = Lazy.from_fun print_newline使用ocamlc -dlambda
(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,但后者不打印。
https://stackoverflow.com/questions/26904655
复制相似问题