Erlang World


top > first step > pattern matching

Pattern Matching

パターンマッチング

この章ではパターンマッチング(パターン照合)について取り扱います。内容的には前回の節「変数」の発展という扱いになります。
前節で取り扱った変数の性質について簡単に復習すると、 「Erlangでは変数には一度しか代入できない」ということでした。

1> Num = 9.
9

2> Num = 3.
** exception error: no match of right hand side value 3

実は、「Erlangの変数には一度しか代入できない」という表現よりも適している表現があります。
それは、

「Erlangにおける符号" = "は代入を意味するのではなく、パターン照合処理を行っている」 という表現です。

パターン照合処理とは、「右辺を評価して、その結果と左辺が一致するかということを調べる」ということです。
ようは、右と左は一緒かどうか調べるということですね。 同じなら問題無しで、違うのならばエラーとなってしまいます。

パターンマッチングと代入の違い

代入は左辺の内容を右辺にすると言えます。
例えば、
Var = X;
は Var を X にすると言えます。

これに対して、パターンマッチは左辺と右辺が同じであるかを調べるのでした。
ですから、すでに値が入っている束縛済み変数と、右辺の値が違うとエラーが出てしまうのです。
それでは、未束縛変数(まだ束縛されていない変数)と右辺のパターンマッチについてはどう扱うのでしょうか。

結論としては、まだ束縛されていないのなら、左辺と右辺を同じ値にすることで、パターン照合が成り立つようにします。
つまり「未束縛変数が左辺の場合は、それを右辺と同じにする」ということです。
これは代入と同じ働きをしています。

パターンマッチは左辺と右辺が同じであるかどうかを調べるということでした。したがって、
「束縛済み変数と"束縛済み変数と同じ内容の右辺"をパターンマッチしてもエラーとならない」
ということです。。

例を見てみましょう。

1> Num = 9.
9

2> Num = 9.
9

先ほどと違い、束縛済み変数に対してパターンマッチを行ってもエラーとなっていません。
なぜなら、Num の中身が右辺と同じ値だからですね。

なぜ単一代入なのか?

さて、ここで疑問が出てくるのではないでしょうか。
「なぜ単一代入なんて煩わしい物を使う必要があるのだろうか」と。

これはErlangの代名詞とも言える、平行処理と多いに関係しています。細かいことは並列処理の章で扱いますが、
Erlangにおいては、
「共有メモリを持たずに単純なメッセージ交換によって平行処理を行うことで、 分かりやすいプログラムを作成することができる」
という根底概念があります。
実は単一代入もこの延長上にあるのです。

仮に一つの変数に値を何度も代入できるとすると、それは並列処理を複雑にしたり、エラーが起きた際のデバッグなどが複雑になってしまうのです。
確かに一度しか変数に代入を出来ないというのは不便ですが、「簡単な並列処理を実装できる」という損失を上回る恩恵があるのです。


Yuichi ITO. All rights reserved.
mail to : ad
inserted by FC2 system