OCaml懒惰评价:'a lazy_t vs unit - >'a

Chr*_*ris 4 ocaml functional-programming lazy-evaluation

两者都达到了同样的目的

# let x = fun () -> begin print_endline "Hello"; 1 end;;
val x : unit -> int = <fun>
# x ();;
Hello
- : int = 1
# let y = lazy begin print_endline "World"; 2 end;;
val y : int lazy_t = <lazy>
# Lazy.force y;;
World
- : int = 2
Run Code Online (Sandbox Code Playgroud)

有什么理由应该优先于另一个?哪一个更有效率?

ivg*_*ivg 7

首先,它们表现不一样,尝试再做Lazy.force y一次,你会注意到差异,"World"不再打印消息,所以计算不会重复,因为结果是在惰性值中记住的.

这是延迟计算和thunk之间的主要区别.他们都将计算推迟到强迫他们的时候.但是thunk将每次评估它的身体,其中懒惰值将被评估一次,并且计算的结果将被记忆.

在引擎盖下,延迟值被实现为具有特殊标志的thunk对象.当运行时首次调用惰性值时,它会将thunk的主体替换为计算结果.因此,在第一次调用之后Lazy.force y,该y对象实际上变成了一个整数2.因此随之而来的呼吁Lazy.force无所作为.