【ぱたーんまっちんぐ】

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

💡 データの形を見て、ぴったり合う処理を自動で選ぶ仕分け名人
📌 このページのポイント
パターンマッチングの仕組み 入力データ 値・型・構造 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(照合)」。データの形に合うパターンを探すイメージだよ
← 用語集にもどる