OCaml lazy

Functional Programming OCaml

OCaml 的求值策略採用 call by value,也就是參數表達式在傳遞前會優先求出結果再傳遞,但是 OCaml 的 lazy 可以無視這個規則。

今天將一個表達式前面加上 lazy,OCaml 是不會自動幫你執行的

let f s =
  print_endline s;
  s
;;

let lazy_value = lazy (f "lazy")

當你需要執行取結果時可以主動使用 Lazy.force lazy_value

另一個特性是 lazy 被執行一次後會幫你記憶結果,所以再次使用 Lazy.force lazy_value 不會再執行運算,而是直接返回第一次的結果,因為這樣,擺在 lazy 後的表達式不應該有副作用,否則會有非預期結果。

另外在官方文件中有提到 Lazy.force 本身並不是執行緒安全的,必須要有相應的措施。