Спецификация OCaml документирует использование значений по умолчанию для необязательных параметров, но не определяет, что произойдет, если значения по умолчанию, например, функция, которая может каждый раз возвращать другое значение.
Из некоторого тестирования кажется, что значение оценивается каждый раз , если аргумент не передается;например,
let x = ref 0;;
let incr x =
x := !x + 1;
!x
;;
let test ?(a = incr x) () = a;;
вызов test ()
приводит к 1, 2, 3, ..., увеличиваясь каждый раз, но вызов test ~a:123 ()
не увеличивает ссылочный номер.
Кажетсянапример, поведение test ()
или test ~a ()
примерно такое же, как
let test ?a () =
let a =
match a with
| None -> incr x
| Some a -> a
in
body_of_test ~a ()
;;
Это правильный способ моделирования? Кроме того, это поведение где-то задокументировано?