Просто чтобы завершить ответ Джеффри, вот версия add
, которая дает вам знать, когда она выполняется:
# let add a b =
Printf.printf "Adding %d and %d...\n" a b;
a + b;;
val add : int -> int -> int = <fun>
Давайте посмотрим на это в действии.
# add (add 1 2) (add 5 8);;
Adding 5 and 8...
Adding 1 and 2...
Adding 3 and 13...
- : int = 16
Итак, здесь сначала оценивается второй add
, но вы не можете рассчитывать на него, поскольку он не указан.
Вот тот же пример использования локального let
для форсирования порядка:
# let x = add 1 2 in
add x (add 5 8);;
Adding 1 and 2...
Adding 5 and 8...
Adding 3 and 13...
- : int = 16
А теперь с помощью частичного применения.
# let add_3 = add 3 in
add_3 (add 5 8);;
Adding 5 and 8...
Adding 3 and 13...
- : int = 16
Конечно, при (чистом) функциональном программировании порядок выполнения не имеет значения, поскольку все является неизменным. Но OCaml не является чисто функциональным, так что эти маленькие хитрости полезно знать. :)