Добавить let () = ...
до выражения верхнего уровня.
Ваша синтаксическая ошибка пришла из последней строки:
let rec print_input arr =
match arr with
| hd::tl -> (print_int hd; print_input tl)
| [] -> ()
print_input input (* this line! *)
Здесь, похоже, print_input input
является приложением функции вОднако на верхнем уровне это также может быть приложение-конструктор () print_input
, как показано ниже:
let rec print_input arr =
match arr with
| hd::tl -> (print_int hd; print_input tl)
| [] -> () print_input input
Грубо говоря, синтаксический анализатор OCaml сначала думает, что это приложение-конструктор, но затем input
остается один, поэтомувозникает ошибка.
Чтобы избежать этого, вы можете использовать let () = ...
:
let rec print_input arr =
match arr with
| hd::tl -> (print_int hd; print_input tl)
| [] -> ()
let () =
print_input input
При таком соглашении все выражения верхнего уровня исчезают.Кроме того, это делает наши программы более безопасными, поскольку требует, чтобы тип возвращаемого выражения был unit
.
Подробнее см. В этом руководстве по OCaml: Структура программ OCaml