初心者がわかったことを書いていきます。
環境
macOS Mojave 10.14.6
Ocaml 4.08.1
###組(tuple)
値を順序をつけて並べたもの。
(* 3つの文字列をもつ tuple *)
("a", "b","c")
値の型は揃ってなくてもよいし、ネストしてもよい。
(* 違う型の値をもつ tuple *)
("a", 12345, 1.34, true)
(* tuple を要素のひとつとする tuple *)
(("a", "b", "c"), 1, 2, 3)
もちろん変数に束縛できる。
let tuple = (1, 2, 3)
パターンマッチ
パターンマッチを使って tuple から値を取り出す。 Ruby で見たことある感じですね。
(* 2つの tuple を持つ tuple を定義 *)
let tpl = (("a", 1), ("Hello", 12.3, true))
val tpl : (string * int) * (string * float * bool) = (("a", 1), ("Hello", 12.3, true)) *)
(* 2つの tuple をそれぞれ別の変数に取り出す *)
let (tuple1, tuple2) = tpl (* (tuple1, tuple2) がパターン *)
tuple1 : string * int = ("a", 1)
tuple2 : string * float * bool = ("Hello", 12.3, true)
(* tuple のすべての要素を分解して変数に取り出す *)
let ((str1, int1), (string2, float1, bool1)) = tpl
str1 : string = "a"
int1 : int = 1
string2 : string = "Hello"
float1 : float = 12.3
bool1 : bool = true
パターンマッチを使って一部の要素を取り出したい。
let tpl = ("a", 1, 3.14)
(* "a" と 1 だけほしい 3.14はいらない *)
(* 悪い例: いらない要素を省略している *)
let (str1, int1) = tpl
# let (str1,int1) = tpl;;
Error: This expression has type string * int * float
but an expression was expected of type 'a * 'b
(* (string型, int型, float型)の tuple が必要なところに('a, 'b)のtupleが与えられたというようなエラーメッセージ *)
(* よい例: いらない要素に "_" (ワイルドカードパターン)を入れる *)
let(str1, int1, _) = tuple
str1 : string = "a"
int1 : int = 1
間違ってたら優しく指摘してください