ダミーのための再帰スキーム?


83

たくさんのリンクをたどったり、圏論の教科書を開いたりする必要のない、再帰スキームとコアカーションスキーム(カタモルフィズム、アナモルフィズム、ハイロモルフィズムなど)の非常にシンプルでわかりやすい説明を探しています。私はこれらのスキームの多くを無意識のうちに再発明し、コーディングの過程で頭の中でそれらを「適用」したと確信しています(私たちの多くが持っていると確信しています)が、私は(共)再帰スキームが何であるかわかりません使用と呼ばれます。(OK、私は嘘をついた。私はそれらのいくつかについて読んでいたので、この質問を促した。しかし、今日まで、私には手がかりがなかった。)

プログラミングコミュニティ内でのこれらの概念の普及は、たとえばWikipediaだけでなく、他の場所でも見られる傾向のある禁止された説明や例によって妨げられていると思います。

それはおそらく彼らの名前によって妨げられています。いくつかの代替の、数学的な名前(バナナや有刺鉄線についての何か?)があると思いますが、私が使用する再帰スキームのよりかわいい名前が何であるかについてもわかりません。

二分木などの抽象データ型ではなく、単純な現実世界の問題を表すデータ型の例を使用すると役立つと思います。


6
Jeremy Gibbonsには、明確で大部分が自己完結型であるため、最良の紹介となる可能性のあるいくつかの論文があります。「ストリーミング表現チェンジャー」(フォールドとアンフォールドの組み合わせ)、「プログラム理解のための分裂」(パラモルフィズムなど)、「過小評価されているアンフォールド」(アナモルフィズム)。cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
スティーブン・テトリー

回答:


44

非常に大まかに言えば、カタモルフィズムはのほんのわずかな一般化ですfold、な一般化です。unfold。(そして、hylomorphismは、折り畳みの後に折り畳みが続くだけです。)それらは通常、圏論との関係をより明確にするために、より厳密な形で提示されます。より密度の高い形式では、データ(始代数の必然的に有限の積)とコデータ(最終余代数のおそらく無限の積)を区別できます。この区別により、フォールドが無限リストで呼び出されないことが保証されます。カタモルフィズムとアナモルフィズムが一般的に書かれる面白い方法の他の理由は、F代数とF余代数(ファンクターから生成される)を操作することによって、リストの上に一度ではなく、一度だけ書くことができるということです。二分木など。これはそれらがすべて同じものである理由を正確に明らかにするのに役立ちます。

しかし、純粋な直感の観点から、あなたはカタとアナを還元と生産と考えることができます、そしてそれはそれについてです。

編集:もう少し

変成作用(テナガザル)は裏返しのハイロのようなものです-その折り畳みの後に展開します。したがって、これを使用してストリームを破棄し、構造が異なる可能性のある新しいストリームを構築できます。

Ekmettは、文献のさまざまなスキームに関する優れた「フィールドガイド」を投稿しました。 http://comonad.com/reader/2009/recursion-schemes/

ただし、「直感的な」説明は簡単ですが、リンクされたコードはそれほど簡単ではなく、これらのいくつかに関するブログ投稿は、複雑で禁止されている側面では少しかもしれません。

とは言うものの、おそらく組織形態を除いて、動物園の残りの部分は必ずしもほとんどの場合直接考えたいものではないと思います。hyloとmetaを「取得」すると、それらだけでほぼすべてを表現できます。通常、他の射はより制限的であり、少なくはありません(したがって、「無料」でより多くのプロパティを提供します)。


1
OK、ありがとう、でもそれはたった3つです-他にもあります。誰かが他の再帰スキームについての答えを追加してくれることを願っています。
ロビングリーン

3
残りの再帰スキームのほとんどは、従属言語でよく見られるタイプの「誘導原理」に非常によく対応するパラモルフィズムを除いて、一種のあいまいです。私はここですべての

3
パラモルフィズムは折り目のようなものですが、「残りの入力」をのぞくことができます。フォールドは、トラバーサル中の基本的なアクセスのみを提供します。
stephen tetley 2011

23

最もカテゴリ理論的な(ただし、「多くのリンクをクリックする」ことを回避できる「テリトリーマップ」を提供することに関連する)から、より単純でより自己完結型へのいくつかの参照:

  • 「バナナと有刺鉄線」の語彙に関する限り、これはMeijer、Fokkinga&Pattersonの元の論文(および他の著者によるその続編)からのものであり、要約すると、あまりかわいい選択肢と同じように表記が重いです: 「名前」(バナナなど)は、それらが固定されている構造のascii表記のグラフィカルな外観への単なるショートカットです。たとえば、カタモルフィズム(つまり折り目)はで表され(| _ |)、括弧付きのパーは「バナナ」のように見えるため、この名前が付けられています。これは「不可侵」と呼ばれることが多い紙なので、私があなただったら最初に調べたものではありません。

  • これらの再帰スキームの基本的なリファレンス(より正確には、これらの再帰スキームへのリレーショナルアプローチ)は、Bird&de Moorのプログラミング代数です(この本は、オンデマンド印刷以外では利用できませんが、中古で入手できるコピーがあります)。 &それはライブラリにあるはずです)。それでも「アカデミック」であるとしても、ポイントフリープログラミングのよりペースのある詳細な説明が含まれています。この本は、自己完結型の方法ではありますが、いくつかの圏論的な語彙を紹介しています。それでも、演習(論文にはない)は役に立ちます。

  • Lex Augustjeinによる射のソートでは、さまざまなデータ構造でソートアルゴリズムを使用して、再帰スキームを説明します。これは、構造上ほとんど「ダミーの再帰スキーム」です。

    このプレゼンテーションでは、平均的なプログラマーにとって不必要に威圧的になりがちな圏論による通常のアプローチではなく、関数型プログラミングで役立つ再帰のパターンとして、さまざまな射を簡単な方法で紹介する機会が与えられます。

  • 記号のないプレゼンテーションを行うための別のアプローチがあるジェレミー・ギボンズの章折り紙プログラミングにおけるプログラミングの楽し前のものと一部重複して、。その参考文献は、トピックの紹介のツアーを提供します。

    編集:ジェレミー・ギボンズは、この質問を読んだ後、本のWebページ全体の参考文献へのリンクを追加したことを知らせてくれました。お楽しみください

これらの最後の2つの参考文献は、(cata | ana | hylo | para)射の確かな説明にすぎないのではないかと思いますが、これで、表記量の多い出版物に見られる代数式を破ることができます。私は、これらの4つ以外の(共)再帰スキームの厳密に非圏論的な説明を知りません。


16

ティムウィリアムズは昨夜ロンドンハスケルユーザーグループで再帰スキームについてあなたが言及したそれぞれのやる気を起こさせる例で素晴らしい話をしました。スライドをチェックしてください:

http://www.timphilipwilliams.com/slides.html

スライドの最後には、すべての通常の容疑者(レンズ、バナナ、有刺鉄線のアラカルトなど)への参照があります。また、これまで出会ったことのない素晴らしいイントロである「OrigamiProgramming」をグーグルで検索することもできます。

アップロードされると、ビデオはここに表示されます。

http://www.youtube.com/user/LondonHaskell

編集問題のリンクのほとんどは、上記のhuitseekerの回答にあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.