【ぱたーんまっちんぐ】

パターンマッチング とは?

公開:
💡 データの形を見て、ぴったり合う処理を自動で選ぶ仕分け名人
📌 このページのポイント
パターンマッチングの仕組み 入力データ 値・型・構造 match 式 パターン1: 数値 1 パターン2: 数値 2 | 3 パターン3: リスト [x, ..] _ (その他すべて) 処理A 処理B 実行! 処理C デフォルト処理 ✓ コンパイラが全パターンの網羅性をチェック
パターンマッチングによるデータの振り分け
ひよこ ひよこ
パターンマッチングって何なの?if文とは違うの?
ペンギン先生 ペンギン先生
if文は「条件が真か偽か」を判定するけど、パターンマッチングは「データの形がこのパターンに合うか」を調べるんだ。たとえば荷物の仕分けで、「四角い箱ならAレーン、筒型ならBレーン、それ以外はCレーン」と形で振り分けるイメージだよ。
ひよこ ひよこ
形で振り分けるってわかりやすいね!具体的にはどんな感じなの?
ペンギン先生 ペンギン先生
たとえばRustだと match 式を使うよ。「この値が1なら〇〇、2か3なら△△、それ以外なら××」と書ける。さらに「リストの先頭が0で、残りが空でない場合」のようにデータの構造まで分解してマッチできるんだ。
ひよこ ひよこ
データの中身まで見られるんだね!if文で書くのとどう違うの?
ペンギン先生 ペンギン先生
大きな違いは「網羅性チェック」だよ。パターンマッチングではコンパイラが「このパターンを書き忘れてるよ」と教えてくれるんだ。if-elseだと「全パターンを網羅してるかどうか」は人間が確認するしかない。パターンが10個あったら、1個漏れてもコンパイラが気づいてくれるのは安心だよね。
ひよこ ひよこ
コンパイラが守ってくれるんだね!どの言語で使えるの?
ペンギン先生 ペンギン先生
HaskellRustでは昔から中心的な機能だよ。最近ではPython 3.10の match/case 文、Java 21のswitch式パターンマッチング、C# 8.0以降のパターンマッチングなど、メジャーな言語にもどんどん導入されているんだ。
ひよこ ひよこ
Pythonでも使えるんだね!正規表現のパターンマッチとは違うの?
ペンギン先生 ペンギン先生
いい質問だね。正規表現は「文字列のパターン」を照合するもので、プログラミング言語のパターンマッチングは「データ型や構造のパターン」を照合するもの。名前は似ているけど、対象がまったく違うんだ。
ひよこ ひよこ
全然違うものなんだね!他に便利な使い方はあるの?
ペンギン先生 ペンギン先生
「ガード条件」を組み合わせると強力だよ。たとえば「値がSomeで中身が0より大きい場合」のように、パターンの形に加えて条件も指定できる。関数型プログラミングではパターンマッチングが基本中の基本で、再帰処理と組み合わせてリストやツリーをエレガントに処理できるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「パターンマッチング」って出てきたら「データの形に合わせて処理を振り分ける仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Pattern Matching」 = パターン照合
💬 「Pattern(型・パターン)」と「Matching(照合)」。データの形に合うパターンを探すイメージだよ
← 用語集にもどる