4 第3 章 従来手法 3.1 基本マッチングアルゴリズム ここでは点パターンマッチング問題を解く基本的なアルゴリズムとして文献[7] の手法 を紹介する. まずp2, 2, = (), =(), = + = , , ,,() 2.   本記事ではその状況に一石を投じたく、一般のプログラマにも伝わるようになるべく図解で「パターンマッチ」を解説してみたいと思います。, 本記事はプログラミング言語における「パターンマッチ」1という機能に着目して解説したものです。「パターンマッチ」は、switch文の強化版2であり、仮にパターンマッチを持たないプログラミング言語のユーザだとしても全プログラマが知っていて損はないアイデアだと思います。, パターンマッチは以下の図のように、入力データを「パターン」と呼ばれる特定の構造と照合して、データとパターンが適合(マッチング)した場合に分解して要素を取り出します。, パターンマッチの凄いところは、入力データの値だけではなく、構造にも着目してデータを抽出できることです。上記の図は入力データとして同じ整数の配列([1,6,5,2])を用いて、4種類のパターンを用いてパターンマッチを実行している様子です。1番目のパターンは特に説明は不要だと思うので、二番目のパターンから説明するとパターン([1,x,5,y])のように、構造から値を抽出しておきたい場所を変数にしておけば、データ構造を分解することができます。抽出した変数は後の変換処理で利用できます。3番目のパターンはパターンマッチが失敗していますが、理由は簡単でパターンと入力データの長さが異なるからです。4番目のパターンは再帰処理でよく使うパターンで配列の先頭とそれ以外にデータを分割できます。, このようにパターンマッチを用いると、データ構造をパターンを用いて分解して処理ができるので、様々なアルゴリズムが書きやすくなるというメリットがあります。, パターンマッチの構文はプログラミング言語ごとに異なりますが、概ね「入力」と「パターン」と「変換処理」を記述できます。以下はscalaを用いた一番シンプルなパターンマッチ構文の例です。, 変換処理では分解によって取り出した変数を利用した処理を書くことができます。そして、変換処理の結果自体がパターンマッチ全体の結果となります。パターンマッチに失敗した場合は一般的には例外が発生します。, 最初の図の4つのパターンマッチをScalaで記述した例が以下になります。Scalaを知らなくても上記の図が理解できていれば、どんな処理をしているのか想像がつくと思います。, パターンはいくつかの基本形に分類されますが、以下は自分が特に重要だと思う9つの基本形です3。パターンマッチで一番誤解を受けいているのがこの部分で、この基本形を十分に理解せずにはパターンマッチを使いこなしているとは言えないと思います。そしてこの基本形を使いこなせるようになればパターンマッチ、ひいてはプログラミングの世界が大きく広がると思います4。, 基本形は組み合わせてより複雑なパターンを記述することができます。重要な役割を果たすのが入れ子構造にすることが可能なシーケンスパターンとタプルパターンです。, 上記の複雑なパターンは「定数パターン」、「変数パターン」、「ワイルドカードパターン」、「シーケーンスパターン」、「タプルパターン」、「asパターン」、「パターンガード」の7つの基本形を組み合わせたパターンになります。このようにパターンは入れ子にすることで飛躍的に表現力が増し、応用範囲が広がります。さらにはパターンマッチで分解した結果を「変換処理」の中でさらにパターンマッチすることもできます。つまりパターンだけでなくパターンマッチ自体も入れ子にすることができます。以下の例はScalaを用いたパターンマッチを入れ子にした例です5。, ここまで読んでいただいた方はパターンマッチにおける基本形の重要さが理解できたと思います。そして一番最初に図解したパターンがどの基本形にあたるかも簡単に分かると思います。プログラミングの重要な目的の一つはデータを処理することだと思います。そしてパターンマッチはデータ構造をパターンで分析し処理するのにうってつけの機能です。従ってパターンマッチは間違いなくプログラミングの本質に迫る機能だと考えられます。, プログラミング言語のパターンマッチは、以下の図のとおり入力と出力がある一種の関数と考えることができます。パターンマッチの内部は「パターン」と「変換処理」と呼ばれるユーザが定義するデータと「照合(check)」、「分解(destructure)」、「変換(transform)」と呼ばれる3つの工程から構成されています6。, 上記の図は「シーケンスパターン」を用いて、整数の配列[1,2,3]の入力に対するパターンマッチを実行している様子を示しています。この入力のパターンマッチは成功して実行結果として5を返しますが、もし、仮に入力が[1,2]だった場合にはパターンの照合に失敗して赤矢印で示した「NG」へ行き、パターンマッチが失敗します。, パターンマッチを関数とみたときにこのように失敗する可能性がある場合は、失敗しない関数(数学的な意味での関数、全関数とも言う)と区別して「部分関数」と呼ぶことがあります。部分関数を全関数にするにはパターンを網羅的にする必要があります。, 「照合」の役割は、以下の図のようパターンに適合(マッチ)する入力データを選別することです。そして適合したデータは次の「分解」のフェーズに送られます。, 「分解」の役割は、以下の図のようにパターンに従ってデータを分解して、変数に対応する値を入力データから見つけて変数に入れることです。分解の結果は次の「変換」のフェーズに送られます。, この分解はパターンマッチ構文以外でも見ることができます。例えば以下は擬似コードですが代入がシーケンスパターンのパターンマッチになっています。, このように代入に見えてパターンマッチになっているケースもあるので、実は知らないうちにパターンマッチのお世話になっているかもしれません。, 「変換」の役割は、以下の図のように変換処理の変数に分解結果の変数を引き当てて、評価することです。評価した結果は出力としてパターンマッチ全体の結果になります。, パターンマッチの合成には直列合成と並列合成があります。直列合成のイメージは以下の図のように通常の関数の合成のイメージと同じで前の関数の出力と後ろの関数の入力の型が合えば合成することができます7。, ソースコードの方が理解しやすい方がいるかも知れないので以下にScalaで2つのパターンマッチを直列合成をした例を記載します。, 以下はパターンマッチの並列合成です。並列合成は大抵の言語のパターンマッチ構文に組み込まれているので、あまり「合成」と意識することは少ないかもしれません。しかし直列合成と比較するとプログラミングの論理演算であるandとorと類似していることが分かると思います。つまり、直列合成の場合はパターンマッチが全て成功しないと合成されたパターンマッチが成功しないのに対して、並列合成ではパターンマッチが一つでも成功すれば、合成されたパターンマッチが成功します。, 以下は直列合成の例を並列合成に書き換えたものです。結果が変わっているのがわかると思います。, 並列合成のパターンマッチの場合には、パターンの重なりを意識することが重要です。以下の図は整数の集合における基本的なパターンの重なりを分類したものですが8、このようにパターンを図で思い描けるようになるとパターンの設計に非常に役に立ちます。, 並列合成では上のパターンマッチから順番に照合されるため、パターンに重なりがあると上のパターンマッチが優先されることになります。特に包含関係にあるパターンは上に大きいパターンを持ってくると下のパターンが隠れてしまって全く照合されない事態になるので、注意が必要です。, またパターンを網羅的にすることでパターンマッチの失敗がなくなり、無意識にバグを作り込むことを防ぐことができます。従ってパターンマッチは特に理由がない場合は網羅的にすることが望ましいです。網羅的にするのに適した基本パターンは「変数パターン」と「ワイルドカードパターン」になるので、並列合成の一番最後にこれらのパターンを入れることを検討してください。, 従来パターンマッチはHaskellに代表されるような関数型言語の十八番でしたが、現在では関数型プログラミングに源流を持たないプログラミング言語でもパターンマッチを実装するようになってきました。C#では7.0以降でパターンマッチが利用可能であり、Rubyでもすでにtrunkではパターンマッチが利用できます9。また比較的新しく出た言語は最初からパターンマッチが使える場合が多く、パターンマッチの世界は広がり続けています。仮にお気に入りの言語にパターンマッチがなかったとしても諦めるのはまだ早いかもしれません。使い勝手は言語に統合された機能よりは劣るかもしれませんが、パターンマッチのためのライブラリも数多く公開されています。, 言語としての変わり種は Egisonです。「直感をそのまま表現するパターンマッチング 」という謳い文句で、パターンマッチとして非常に面白いので気になった方はぜひ触って見てください。, このように少しずつですが着実にパターンマッチが使える言語が増え続けているのは、パターンマッチがプログラミング全般で非常に用途が広く、使いこなすことで直接的にプログラマの能力を拡張するからだと思っています。以下の図は思いついたパターンマッチの用途です。, パターンマッチは関数型プログラミングでは特に再帰関数と相性が良く欠かせない存在ですが、一般のプログラマへの浸透具合はいまいちと感じたので、関数型プログラミングの文脈からなるべく切り離して解説をしてみました。, ここで言うぱ「パターンマッチ」はパターンマッチを実装しているプログラミング言語の総和でイメージしており、特定のプログラミン言語のパターンマッチを意味していません。従って、本記事で解説しているパターンマッチの機能や用語は個別の言語でそれぞれ異なる場合があります。 ↩, ここで言う「switch文」とはC言語のswitch文をイメージしています。また、ここではswitch文とパターンマッチとの歴史的な繋がりではなく、機能的な包含関係について「強化版」という表現をしています。 ↩, パターンの記述は疑似言語で記載しています。また、パターンマッチの対応を謳っているプログラミング言語でも、いくつかの基本形が使えない場合があります。しかし上の6つのパターンはだいたい使えるのではという感触です。 ↩, 9つの基本形は非常に重要なのでA4サイズで収まりがいいように図を工夫しました。チートシートとしてご利用ください。机や冷蔵庫に貼って忘れないようにするのもいいかもしれません(笑)。 ↩, 工程の呼び方はいろいろあります。例えばdestructureとextractと呼んだりtransformをmapと呼ぶ場合もあるようですが、ここでは自分が一番分かりやすいと思った表現を採用しています。また、「照合」と「分解」だけを指して「パターンマッチ」と呼ぶ流儀も存在しますが、多くのプログラミン言語のパターンマッチの構文には変換処理も含まれるので、この記事では「変換」も含めて「パターンマッチ」と呼びます。 ↩, 実際には型だけでなく関数の定義域や値域を考慮する必要がありますが、数学的な話になってくるので詳細は割愛します。 ↩, 整数にしたのはイメージが簡単にできると思われるためであり、ここで説明するパターンの重なりは整数以外の集合にも同じことが言えます。 ↩. }); インナービジョン連載中のリジット 山本修司「ImageJで学ぶ実践医用・バイオ画像処理」を自分の勉強のためにリメイクした「Re-ImageJで学ぶ!」を開設いたしました。 (adsbygoogle = window.adsbygoogle || []).push({ 再帰パターン. You'll often find that pattern matching expressions can be a very useful tool when you're working with data and want to separate the data storage concerns from the behavior concerns. [JRECIN] 日本語なみに英語が使えて研究実績・実務経験もある東大の博士研究員の時給が驚愕の1700円~!!, MDPIはハゲタカジャーナルか?「知らんがな」MDPIのインパクトファクター(JCR2018)(2019年6月発表), 自分が研究に向いているかどうかを知る24の質問 ~プロの研究者になるために必要な素養とは?進路に迷っている人のための条件チェックリスト~, 令和2年度(2020年度)科学研究費助成事業(科研費)新規採択件数 国立大学ランキング, ハゲタカジャーナル(粗悪学術誌)論文掲載 不名誉な大学ランキング【悲報】東大、阪大などの研究者も投稿していたことが発覚  (≧▽≦ ), 国際学会も怖くない!英語の研究プレゼンで使える英文フレーズとその発音を youglish.com で学ぶ, 2TB、4TB、8TBのポータブル外付けSSDドライブの価格、メーカー、製品情報(2020年6月), 2020年早稲田大学理工入学試験問題数学で出題ミスの指摘 物理、化学も 文学部国語まで, 科研費は基盤研究(A)に出すべきか、それとも手堅く基盤(B)に出すか、審査区分はどこにするか?, 東京学芸大学 准教授がセクハラで停職3カ月・諭旨解雇 学芸大のアカハラ・セクハラ事件簿, 2019年度の科研費新規採択率が発表される~若手40.0%、基盤(B)29.2%の記録的高さ~, 登録者数200万人の人気YOUTUBERラファエル氏が規約違反でチャンネルを削除される, 蛋白質、たん白質、たんぱく質、タンパク質、タンパク、たんぱく、たん白、蛋白、プロテイン、‥ proteinの正しい日本語訳は何?, 植松努が教える夢の実現法『思うは招く』【感動のTED講演】~「どうせ無理」「だったらこうしてみたら?」~, 滑らかな書き味のボールペン パイロットのアクロインキ vs. 三菱鉛筆(Uni)のジェットストリーム.

カーリース 審査なし 熊本, 挨拶文 ビジネス お祝い, 車 中泊 グッズ 100均, シンイ 最終回 解説, パプリカ 英語 いち なる, ウッドデッキ シェード 柱, スペイン語 単語 基本, パース 奥行き 決め方, フランス版シティーハンター 上映 館, 塚口 完全個室 居酒屋, ヤフーショッピング クーポン 予定, クレーンゲーム 確率機 カリーノ, 借金地獄 の 疑惑がある 芸能人, Iphoneバックアップ できない 写真, 犬鳴村 映画 無料視聴, 水耕栽培 Led 自作, 日本人 顔 特徴, リリィ 歌詞 クロマニヨンズ, 西宮北口 地図 グーグル, タバコ 通販サイト おすすめ, 看護師 問診 アセスメント, Sao リコリス 神聖術解放, タガタメ カグラ 開眼,