Прежде всего, ocaml позволяет вам написать несколько операторов в if then else
, просто это не так, как в языках, подобных C.
if condition then begin
instruction1 ;
instruction 2 ;
(* ... *)
end
else begin
(* ... *)
end
Блок begin (* ... *) end
работает так же, каккруглые скобки, так что вы также можете просто заключить в скобки:
if condition then (
instruction1 ;
instruction 2 ;
(* ... *)
)
else (
(* ... *)
)
Таким образом, вы можете сделать свою оптимизацию очень хорошо.
Здесь происходит то, что при написании if b then t else f
в ocaml, вы создаетезначение типа T
, если t : T
и f : T
. Например, вы можете написать if b then 0 else 1
или if b then "Hello" else "Goodbye"
. Он также работает с типом unit
(тип большинства инструкций):
if b then instruction1 else instruction2
Оператор точки с запятой позволяет последовательно выполнять две инструкции:
(;) : unit -> unit -> unit
Обратите внимание, что это не тактак же, как и в большинстве языков, где отмечается конец инструкции.
Проблема в том, что когда вы пишете
if b then instruction1 else instruction2 ; instruction 3
, это не понимается как
if b then instruction1 else (instruction2 ; instruction 3)
как вы хотели, но как
(if b then instruction1 else instruction2) ; instruction 3
, что также имеет смысл, потому что выражение if
также имеет тип unit
.