F#の列挙型とパターンマッチ
先ずは、F#で列挙型を宣言する方法をサンプルで示します。
//列挙型を宣言
type Number =
| One = 1
| Two = 2
| Three = 3;;
凄く簡単なので、列挙体を宣言はサンプルを見れば直ぐにわかると思います。今度は、この列挙型を使って、パターンマッチを行う関数を定義してみます。
let childCount x =
match x with //定数パターンを行うmatch式
| Number.One -> printfn "い~ち"
| Number.Two -> printfn "にぃー"
| Number.Three -> printfn "さぁ~~ん!"
| _ -> printfn "分からないよぉ";;
この列挙型を使ったパターンマッチは定数パターンです。定数パターンについては、F#の定数パターンで解説しているので読んで下さい。この記事のサンプルと今回のサンプルを見比べると、列挙型を使った方が、プログラムの意図が分かりやすくなっているのが分かると思います。もしかしたら、この様な簡単なサンプルでは分からないかもしれませんが、列挙型は大変重要です。実務で定数パターンを扱う際には、直接数値を書くのではなく、列挙型を使用しましょう。列挙型を使用すると、プログラムの変更が行いやすく、可読性が上がります。例えば、60万行のプログラムを要するプロジェクトがあるとします。この状況下で、次に示すサンプルの様なプログラムが多ければ、プログラムの保守と変更がやり難くなります。
//数値を直接書いた酷いプログラム
let SelectAction x =
match x with
| 0 ->
| 1 ->
| 100 ->
let Foo x =
match x with
| 10 ->
| 20 ->
| 999 ->
let y = Foo 999;;
※このサンプルはコンパイルできません。この調子で永遠とプログラムが続いていると、何をしているのか分かり辛く、プログラムの変更が困難になります。例えば、このサンプルで、Foo関数の999を333に変更する場合の事を考えてみます。この場合、全プログラムのFoo関数呼び出しの引数の値や、その数値を返す関数などを全てチェックして、漏れなく333に書き変えなくてはなりません。チェックが漏れると、プログラムが正常に動作しません。この作業は非常に退屈で、間違いが起きやすいので、列挙型を使う方が良いという事が分かって頂けると思います。
定数パターンは列挙型と共に使用しましょう。