它可以幫助需要注意的是函數閉基本上等同於懶惰值:
lazy n : 'a Lazy.t <=> (fun() -> n) : unit -> 'a
force x : 'a <=> x() : 'a
所以類型'a llist
相當於
type 'a llist = 'a cell Lazy.t
即,一個懶惰的單元格的值。
的地圖實現可能更有意義上述定義
let rec map f lst =
match force lst with
| Nil -> lazy Nil
| Cons (hd,tl) -> lazy (Cons (f hd, map f tl))
翻譯的術語,其放回關閉:
let rec map f lst =
match lst() with
| Nil -> (fun() -> Nil)
| Cons (hd,tl) -> (fun() -> Cons (f hd, map f tl))
與追加
同樣
let rec append a b =
match force a with
| Nil -> b
| Cons (hd,tl) -> lazy (Cons (hd, append tl b))
變得
let rec append a b =
match a() with
| Nil -> b
| Cons (hd,tl) -> (fun() -> Cons (hd, append tl b))
我通常更喜歡使用lazy
語法,因爲它使得它更清楚發生了什麼。
請注意,還有一個懶惰懸掛和關閉不是正好等效。例如,
let x = lazy (print_endline "foo") in
force x;
force x
打印
foo
而
let x = fun() -> print_endline "foo" in
x();
x()
打印
foo
foo
的區別在於force
計算表達式的值恰好一次。