2008年03月19日

OCamlのお勉強 その7 〜リスト〜

プログラミング 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式より少しだけ書くのが楽になります。

今回はここまで。次回はリストの練習問題をいくつか解いていきます。

posted by bakemoji at 00:11| Comment(0) | TrackBack(0) | OCaml | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は90日以上新しい記事の投稿がないブログに表示されております。