はじめての OCaml (3) - さまざまなデータ型 - 備考録とエトセトラ
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