我刚开始学习OCaml。我有一个问题,为什么每次打电话给他时这段代码会输出不同的结果?
let b () = Unix.time ();;
let a ?(c = b ()) () = c;;
a ();;
...
a ();;
我预计, c 的默认值将计算一次。
答案 0 :(得分:4)
可选参数在OCaml手册的Section 6.7中描述。这就是它的内容:
表格的功能
fun ? lab :( pattern = expr0 ) -> expr
相当于
fun ? lab : ident ->
let pattern = match ident with
| Some ident -> ident
| None -> expr0
in
expr
其中ident是一个新变量,除了在计算expr0时未指定。
如果未提供可选参数,则显示在每次调用时评估expr0
。即,expr0
在lambda内,而不在外面。