У вас есть два уровня робота. Поскольку вы явно назвали свой модуль «Робот» в файле robot.ml, вам нужно открыть Robot, а затем вызвать Robot.top (). Все, что находится в файле robot.ml, уже неявно помещено в модуль Robot.
Вы можете избавиться от дополнительного объявления 'module Robot' в robot.ml.
robot.ml станет:
module type RobotSignature =
sig
val top: unit -> unit
end
let top () =
begin
Printf.printf "top\n"
end
Тогда это должно работать, как у вас есть в вашем main.ml.
Обновление на основе комментариев ниже: Если вы обеспокоены тем, что все, что в robot.ml теперь будет видно при открытии Robot, вы можете определить файл robot.mli, в котором указаны функции, которые доступно внешне. Например, допустим, вы добавили функцию с именем helper в robot.ml:
let top () =
begin
Printf.printf "top\n"
end
let helper () =
Printf.printf "helper\n"
... и затем вы определяете свой robot.mli следующим образом:
val top: unit -> unit
Тогда, скажем, вы пытаетесь вызвать помощника из main.ml:
open Robot;;
top();
(* helper will not be visible here and you'll get a compile error*)
helper ()
Затем, когда вы попытаетесь скомпилировать, вы получите ошибку:
$ ocamlc -o main robot.mli robot.ml main.ml
File "main.ml", line 4, characters 0-6:
Error: Unbound value helper