OCamlには、様々なデータ型が言語機能として組み込まれています。

リスト

OCamlには、リストが言語機能として組み込まれています。

以下は、整数値のリストの定義です。

let list = [1; 2; 3];;

リストに格納する値は、全て同じデータ型でなくてはなりません。

たとえば、以下は許容されません。

let list = [ 1; 2.5; 3 ];;
(*
 * Error: This expression has type float but an expression was
 *        expected of type int
 *)

リストのデータは、パターンマッチの処理をする場合や、可変長のデータを扱う際にその威力を発揮すると思います。

半面、ランダムアクセス(配列のNan番目にアクセス)は苦手としています。

配列

リストと似ていますが、データレイアウトがリストとは異なります。

以下は、整数値の配列の定義です。

let arr = [| 1; 2; 3 |];;

(* 先頭から2番目の値を取り出す *)
let i = arr.(1);;  (* i : int = 2 *)

配列のデータは、固定長のデータに高速にアクセスする場合にその威力を発揮します。

可変長のデータの扱いは苦手です。

タプル

異なるデータを組み合わせたデータ型として、タプル(組)があります。

以下は、int数値と、文字列のタプルの例です。

let tuple = (1, "Hi");;

タプルのデータは、以下のようにすると拾えます。

let tuple = (1, "Hi");;
let (i, s) = tuple;;
(*
 * i : int = 1
 * s : string = "Hi"
 *)
let (_, x) = tuple;; (* "_" を使うと、要らないデータを切り捨てることができます *)
(*
 * x : string = "Hi"
 *)

レコード

レコードは、C言語の構造体に相当するデータ型です。

異なる型のデータを、それぞれ名前をつけて管理することができます。

データの値は、基本固定で変更することができませんが、mutableキーワードを型宣言時に追加すると、後からデータを変更できるようになります。
(ただし、あまり関数型言語っぽくないスタイルかもしれないので、積極的に使うような機能ではありません)

(* newtype 型の宣言 *)
type newtype = {
	name : string;
	affiliation : string;
	mutable alive : bool;
};;

(* newtype インスタンスの作成 *)
let gundam = {
	name = "Amuro";
	affiliation = "United A.F.";
	alive = true;
};;

(* name データの取り出し *)
let x = gundam.name;;  (* x : string = "Amuro" *)

(* alive データの内容を変更 *)
gundam.alive <- false;;
(*
 * gundam : newtype = {
 *     name = "Amuro";
 *     affilication = "United A.F.";
 *     alive = false
 * }
 *)

どうでもよいですが、私はガンダムはじぇんじぇん詳しくありません。

バリアント

バリアントは、C言語のenumとunionをくっつけたようなデータ型です。

パターンマッチと相性がよいとされています。

type va = A| B| C;;


blog comments powered by Disqus