2011年4月9日土曜日

OCaml Pattern Matching

引きつづきOCaml。今度はパターンマッチング。パターンマッチング自体はその名の通り、与えられた引数の値に応じた値を返す関数を定義する仕組み。

組込み型でのパターンマッチング

(* normal pattern matching *)
let color_to_num = function
    "RED" -> 0
  | "BLUE" -> 1
  | "GREEN" -> 2
  | _ -> -1;;

let num = color_to_num "RED" in
Printf.printf "%d\n" num;;

let num = color_to_num "aardvark" in
Printf.printf "%d\n" num;;

出力

$ ./a.out
0
-1

独自型でのパターンマッチング

(* matching via Sum type*)
type color_t = Red | Blue | Green ;;
let color_t_to_num = function
    Red -> 0
  | Blue -> 1
  | Green -> 2;;

let num = color_t_to_num Blue in
Printf.printf "%d\n" num;;

(* Compile error
let num = color_t_to_num Black in
Printf.printf "%d\n" num;;

let num = color_t_to_num "aardvark" in
Printf.printf "%d\n" num;;
*)

出力

$ ./a.out
1

やっぱ型チェックが厳しいと安心してコードがかけるのがいい。正直Pythonとかはもうあまり書きたくないかも。

パターンマッチングの文法に関しては、let xxxx = function ... という書きかたと let xxxx = match x with ... という書きかたの使いわけが良くわからない。ただ、Oreillyの本で読むかぎりだとfunctionを使う方は単なるシンタックスシュガーっぽい。

0 件のコメント:

コメントを投稿