Было бы намного легче понять синтаксис OCaml, если мы будем придерживаться грамматики, в которой элемент верхнего уровня может быть только определением 1 , которое имеет форму
let <patt> = <expr>
, который имеет следующую семантику - вычислить выражение <expr>
и применить его к шаблону <patt>
, если есть совпадение, а затем обогатить глобальный контекст переменными, связанными в шаблоне <patt>
.
Следовательно, обычное решение вашей проблемы будет
let f x = x + 1
let g x = x + 2
let h x = x + 3
let () =
Printf.printf "%d \n" (f (h (g 3)));
()
По историческим причинам OCaml разрешает выражения, такие как 1
, "hello"
или let x = 1 in x + x
на верхнем уровне, при условии, что вы разделяете их, используя ;;
. В основном это связано с совместимостью с интерактивной системой верхнего уровня, так что вы можете использовать OCaml в качестве калькулятора. Я бы не советовал использовать ;;
в реальных программах OCaml, написанных для использования компилятором.
1) Вы называете их объявлениями , хотя на самом деле они являются определениями, однако для нашего случая это не имеет значения.