「プログラミング in OCaml ~関数型プログラミングの基礎からGUI構築まで~」を読んでの勉強記録です。
リストを作成できる。リストは再帰的なデータ構造である。
- 空リスト
[]
はリスト - リスト
l
の先頭に要素e
を加えたe :: l
はリスト
# [0; 1; 2; 3];; - : int list = [0; 1; 2; 3] # [];; - : 'a list = [] # 3 :: [];; - : int list = [3] # 2 :: 3 :: [];; - : int list = [2; 3] # 1 :: 2 :: 3 :: [];; - : int list = [1; 2; 3] # 0 :: 1 :: 2 :: 3 :: [];; - : int list = [0; 1; 2; 3]
リストのリストなども作れます。ただし、リストの各要素は同じ型でなければなりません。
パターンマッチングによりリストの先頭要素と後に続くリストそれぞれに変数を束縛できる。match式でパターンによる分岐を記述できる。
# let rec project f l = match l with | [] -> [] | x :: rest -> f x :: project f rest;; val project : ('a -> 'b) -> 'a list -> 'b list = <fun> # project string_of_int [0; 1; 2; 3; 4];; - : string list = ["0"; "1"; "2"; "3"; "4"] # project (fun x -> x * x) [0; 1; 2; 3; 4];; - : int list = [0; 1; 4; 9; 16]
project関数は与えられた関数fに基づいてリストの射影を求める関数です。通常、mapやselectなどと名付けられることが多いです(実際、OCamlにはmap関数があります)。リストに対する高階関数の基本ですね。
リストの各要素に対して処理をするような関数はほとんど上記のように「空リストの場合は何かを返して終了、そうでない場合は残りのリストに対して再帰」という形になります。
match式を組み込んだ匿名関数をfunction構文で定義できる。
# let rec project f = function | [] -> [] | x :: rest -> f x :: project f rest;; val project : ('a -> 'b) -> 'a list -> 'b list = <fun>
function構文を使うことでmatch with式より少しだけ書くのが楽になります。
今回はここまで。次回はリストの練習問題をいくつか解いていきます。