2022/01/30

OCaml入門者のためのちょっとややこしいOCamlのクセ

いろいろクセのある言語OCaml

整数と浮動小数点数の演算子は区別されている

OCamlでは、整数と浮動小数点数の演算子が明確に区別されています。その理由は「Real World OCaml」に書かれていますが、整数型と浮動小数点数型間で、自動的にキャストしないことで他言語で発生する予期しないバグを防ぐためです。このバグについてはこちら


# 1 / 3 ;;
- : int = 0
# 1. /. 3. ;;
- : float = 0.333333333333333315

リストの区切りはセミコロン

多くの言語では、リストの区切りにカンマ[1, 2, 3, ...]を使いますが、OCamlでは、リストの区切りにセミコロン[1; 2; 3; ...]を使います。

カンマを使って区切った場合、OCamlでは全く別のリストになってしまいます。


# [1; 2; 3] ;;
- : int list = [1; 2; 3]
# [1, 2, 3] ;;
- : (int * int * int) list = [(1, 2, 3)]

上記のコードをご覧ください。上のコードはセミコロンで区切ったもので、型はintのlistとなっています。一方、下のコードは3つの要素からなるタプルを1つの要素としたリストになっています。アスタリスクは型情報の場合、タプルを表します。これも整数の乗算の演算子と同じというところがちょっとややこしいかもしれません。

配列と文字列のindexingのカッコが違う

これもなかなかのクセですが、配列と文字列のindexingのカッコが違うという小さなクセがあります。

OCamlで配列を表す場合、[|1; 2; 3; 4|]という形になります。|が固定してるぞ!感があって、個人的には嫌いではありません。

配列のindexingの場合は以下のようになります。


# let arr = [|1; 2; 3; 4|] ;;
val arr : int array = [|1; 2; 3; 4|]
# arr.(1) ;;
- : int = 2

配列の場合は、.(インデックス)と、丸カッコを使います。

一方、文字列の場合は以下のようになります。


# let s = "Hello, world!!" ;;
- : string = "Hello, world!!"
# s.[1] ;;
- : char = 'e'

なんと文字列の場合は角カッコになります。

これは個人的には同じじゃダメですかね?と聞きたいところであります。

等号と不等号

他言語では、等号や不等号が==/=とか!=という形ですが、OCamlは=<>なります。


# 1 = 1 ;;
- : bool = true
# 1 <> 1 ;;
- : bool = false

不等号はある意味わかりやすいですが、等号は他言語に慣れた方だと間違う恐れがありそうです。

まとめ

今回、なんとなく気づいたクセを書き出しました。まだまだクセがあるかもしれません。しかしそのクセも個性。個性を大切にし、魅力に変えるフランス発祥の言語らしい気がします。「私はこうなんだ!」と燦然と輝きを放つOCaml、皆様も一緒に勉強しませんか?