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

时间:2016-11-16 17:23:44

标签: functional-programming ocaml 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

是否有任何理由应该优先于另一个?哪一个更有效率?

2 个答案:

答案 0 :(得分:7)

首先,它们的行为不一样,再试一次Lazy.force y,你会注意到差异,"World"消息不再打印,所以计算不是重复,因为结果被记住了懒惰的价值。

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

在引擎盖下,延迟值被实现为具有特殊标志的thunk对象。当运行时首次调用惰性值时,它会将thunk的主体替换为计算结果。因此,在第一次调用Lazy.force y之后,y对象实际上变为整数2。所以随后对Lazy.force的调用什么都不做。

答案 1 :(得分:2)

Lazy.force再次返回相同的值而不重新计算它。

为例

let ra = ref 0 ;;
let y = lazy (ra:= !ra+1);;
Lazy.force y;;
# Lazy.force y;;
- : unit = ()
# !ra;;
- : int = 1
# Lazy.force y;;
- : unit = ()
# !ra;;
- : int = 1