Скомпилируйте однофайловую программу ocaml с модулем и основным методом

Я почему-то не могу установить рабочую среду 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 работает! Нельзя ли определить модуль вверху файла. Или где синтаксическая ошибка?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам не хватает ;; в конце объявления модуля:

module Atom = struct
  let hello name = print_string ( "Hello " ^ name )
end;;

print_string "Hello, World!";
Atom.hello "Florian"

Сопутствующая документация.

(Также удалите завершающий ;. Точки с запятой (по сути) предназначены для разделения выражений в OCaml, а не для их завершения.)

Jeffrey Scofield 21.06.2024 10:02

Ваш модуль — это определение верхнего уровня, а остальное — выражение. Только первый должен находиться на верхнем уровне программы 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)

Другие вопросы по теме