В этом let
выражении нет ничего особенного в ()
, это просто шаблон. Все let
выражения выглядят как let
pattern
=
expression
in
other-expression
. Здесь шаблон всегда будет совпадать, потому что print_string
возвращает unit
, а ()
является единственным значением этого типа. Таким образом, это просто еще один способ объединения двух выражений в одно, когда первое действительно больше оператора (возвращает unit
).
Итак, вы правы, конструкция имеет почти то же значение, что и оператор ;
. Единственная реальная разница в приоритете. Если, например, вы пишете
if x < 3 then
print_string "something";
f x
вы обнаружите, что f x
всегда вызывается . Приоритет ;
слишком низок, чтобы передать второе выражение под контроль if
. Вот почему многие люди (включая меня) привыкли использовать let () =
expression
. Если вы напишите выше, как
if x < 3 then
let () = print_string "something"
in f x
f x
вызывается только тогда, когда x
меньше 3, что обычно является тем, что я хочу. По сути, приоритет let
намного выше, чем ;
.
Конечно, есть и другие способы получить этот эффект, но хорошая вещь в использовании let
заключается в том, что вам не нужно ничего добавлять позже в коде (например, закрывающая скобка или end
) , Если вы добавляете print_string
в качестве оператора отладки, это удобный способ сохранить изменения локальными для одного места.