Я почему-то не могу установить рабочую среду OCaml на свой компьютер с Windows. Я хочу использовать онлайн-компилятор OCaml. Проблема: я могу записать туда только один файл и поместить все в этот файл:
module Atom = struct
let hello name = print_string ( "Hello " ^ name );;
end
print_string "Hello, World!";
Atom.hello "Florian";
Приведенный выше код выдает ошибку:
Output:
File "./HelloWorld.ml", line 7, characters 0-12:
7 | print_string "Hello, World!";
^^^^^^^^^^^^
Error: Syntax error
Без модуля Atom print_string работает! Нельзя ли определить модуль вверху файла. Или где синтаксическая ошибка?





Вам не хватает ;; в конце объявления модуля:
module Atom = struct
let hello name = print_string ( "Hello " ^ name )
end;;
print_string "Hello, World!";
Atom.hello "Florian"
Ваш модуль — это определение верхнего уровня, а остальное — выражение. Только первый должен находиться на верхнем уровне программы OCaml. Определения верхнего уровня не обязательно разделяются знаком ;;, но определения и выражения верхнего уровня разделяются.
Вы можете добавить ;; в конец определения вашего модуля, чтобы исправить ошибку, которую вы видите, но лучше сделать это выражение частью привязки верхнего уровня к (). Правильно сформированная программа OCaml не должна содержать ;;.
Конечно, играться с кодом в REPL – это другое дело.
module Atom = struct
let hello name =
print_string ("Hello " ^ name)
end
let () =
print_string "Hello, World!";
Atom.hello "Florian"
Вы также можете использовать print_endline для более приятного вывода и для решения потенциальных проблем с буферизацией вывода.
module Atom = struct
let hello name =
print_endline ("Hello " ^ name)
end
let () =
print_endline "Hello, World!";
Atom.hello "Florian"
В качестве дальнейшего предложения вы можете использовать модуль Printf или Format вместо конкатенации строк. Выгода в этом случае минимальна или равна нулю, но для более сложных отпечатков это может помочь уточнить ваш код.
module Atom = struct
let hello name =
Format.printf "Hello %s\n" name
end
Более сложный пример:
print_endline ("The product of " ^ string_of_int x ^ " and " ^ string_of_int y ^ " is " ^ string_of_int (x * y))
Или:
let sx = string_of_int x in
let sy = string_of_int y in
let sp = string_of_int (x * y) in
print_endline ("The product of " ^ sx ^ " and " ^ sx ^ " is " ^ sp)
Против.
Format.printf "The product of %d and %d is %d\n" x y (x * y)
(Также удалите завершающий
;. Точки с запятой (по сути) предназначены для разделения выражений в OCaml, а не для их завершения.)