きくらげ観察日記

好きなことを、適当に。

OCaml初心者が戸惑いそうな謎記号一覧

^(キャレット)

^は文字列連結の演算子です。

# "hoge" ^ "fuga";;
- : string = "hogefuga"

+., -., *., /.

浮動小数点数同士の演算には、元の演算の記号の後にドットが付きます。Schemeと同じですね。

# 3.0 +. 4.0;;
- : float = 7.

<>

<>はノットイコールを表します。これはPHPやCoqなどと同じなので、見慣れている人もいるかもしれません。

# "hoge" <> "fuga";;
- : bool = true

@(アットマーク)

@はリストの連結を表します。ちなみにリストの要素の区切りはカンマではなくセミコロンです。

# [1; 2; 3] @ (4 :: 5 :: 6 :: []);;
- : int list = [1; 2; 3; 4; 5; 6]

'(シングルクォーテーション)

識別子の前に付く'は、その識別子が型変数であることを表します。

# let identity (x : 'a) : 'a = x;;
val identity : 'a -> 'a = <fun>
# identity 3;;
- : int = 3
# identity 'a';;
- : char = 'a'

`(バッククォーテーション)

識別子の前に付く`は、多相バリアントのコンストラクタを表します。

# function | `Ok a -> string_of_int a | `Ng -> "<error>";;
- : [< `Ng | `Ok of int ] -> string = <fun>

この関数は、`Ok of intまたは`Ngの2つ(未満)のコンストラクタからなるある種の匿名型のようなものを引数に受け取っています。

[> .. ]

これも多相バリアントの記号です。

型[> `A | `B ]は、少なくとも`A, `Bの2つのコンストラクタからなる匿名型(のようなもの)を表します。

# let (x : [> `A | `B]) = `B;;
val x : [> `A | `B ] = `B
# let (x : [> `A | `B]) = `C;; (* `A, `B 以外のコンストラクタも許す *)
val x : [> `A | `B | `C ] = `C

[< .. ]

これも多相バリアントの記号です。

型[< `A | `B ]は、`A, `Bの2つのコンストラクタまたはその一部からなる匿名型(のようなもの)を表します。

# let f = function | `A -> "A" | `B -> "B";;
val f : [< `A | `B ] -> string = <fun>
# let x : [`A] = `A;;
val x : [ `A ] = `A
# f x;; (* f の引数の型の部分集合を引数に与えてもOK *)
- : string = "A"
# f `C;; (* `C は f の引数型に含まれないので☓ *)

その他

OCamlでは独自の演算子を定義することもできます。意味不明な演算子があった場合はライブラリのドキュメントを参照してみましょう。

# let (++) x y = x @ y;;
val ( ++ ) : 'a list -> 'a list -> 'a list = <fun>
# ['h'; 'e'; 'l'] ++ ['l'; 'o'; '!'];;
- : char list = ['h'; 'e'; 'l'; 'l'; 'o'; '!']