---
breaks: false
tags: public-tech
---
# 2 つの式を `;` でつないで逐次実行する
この記事は [OCaml Tips Advent Calendar 2022](https://adventar.org/calendars/8396) の17日目です。
OCaml で、まずひとつ目の式を実行し(例えば `print_string "Hello"`)、
続いて2つ目の式を実行したい場合(例えば `print_string "World"`)、
`let ... in` 式でつないで書くこともできますが、始めの式の戻り値の型が
`unit` の場合は `;` でつないで書くことができます([Sequence](https://v2.ocaml.org/manual/expr.html#sss:expr-sequence))。
```ocaml
(* こう書いてもよいが、冗長 *)
let () = print_string "Hello" in
print_string "World"
;;
(* こう書ける *)
print_string "Hello";
print_string "World"
;;
```
1つ目の式が `unit` を返さない場合でも、その実行結果が不要な場合は、
1つ目の式に`ignore` を使うことで `unit` を返すように整形してから `;` で
つなぐことができます。この場合、演算子 `|>` や `@@` が便利です。
これらの演算子については [AdC 6 日目](https://hackmd.io/@anqou/HJl-dGhDi)の記事を参考にしてください。
```ocaml
(* 関数 f は unit 以外の値を返す関数とする *)
(* こう書いてもよいが冗長 *)
let _ = f () in (* 実行するが、結果は捨てる *)
print_string "Hello world"
;;
(* こう書ける *)
ignore (f ());
print_string "Hello world"
;;
(* 演算子 |> や @@ を使って見やすくできる *)
ignore @@ f ();;
f () |> ignore;;
```
## ところで
昨日(16日)、[OCaml 5.0 がリリースされました](https://discuss.ocaml.org/t/ocaml-5-0-0-is-out/10974)! ついに OCaml でも(共有メモリを使う)
並列実行ができるようになったほか、エフェクトハンドラも導入されました。
これらについて、OCaml Tips AdC でも(最終週あたりで)触れられたらいいなと
思っています。