Когда ocamlc
загружает модуль, он оценивает все определения «верхнего уровня» в том порядке, в котором они определены.В вашем случае у вас есть три определения «верхнего уровня».
Первое - это значение unit
(единственное значение типа unit
), которое связано с именем"тестовое задание".Это значение генерируется после побочного эффекта: отображение «ха-ха» (здесь модуль Area
служит пространством имен, оно не задерживает вычисления);
Вторым являетсятакже значение unit
, но без привязки имени;Это значение также генерируется с побочным эффектом: отображение «хе-хе»;
Последнее - это просто значение, связанное с именем «тест», т.е.unit
.Однако на этот раз побочных эффектов нет, так как значение unit
, связанное с именем «test», уже сгенерировано.
Если вы хотите получить побочный эффекткаждый раз, когда вы вызываете test, вам нужно использовать функцию:
let test () = Print.printf "haha"
И для ;;
части вашего вопроса.Они нужны анализатору, чтобы знать, когда заканчивается выражение.Существуют и другие способы помочь анализатору, например:
let () = Print.printf "hehe"
Или просто:
let _ = Area.test
Последний вариант короче, потому что вам не нужно указывать информацию о типе, но онболее подвержен ошибкам, потому что компилятор не согреет вас в случае частичного применения.