カテゴリー理論は関数型プログラミングの学習に役立ちますか?


118

私はHaskellを学んでおり、その言語に魅了されています。しかし、私には深刻な数学やCSのバックグラウンドはありません。しかし、私は経験豊富なソフトウェアプログラマです。

Haskellでより良くなるために、カテゴリー理論を学びたいです。

Haskellを理解するための良い基礎を提供するために、カテゴリー理論のどのトピックを学ぶべきですか?



1
プログラミングとcsを区別していただきありがとうございます。
jmite

4
「Haskellで良くなる学習カテゴリ理論」は「テニスで良くなる物理学を学習する」
-user26756

回答:


115

では理論計算機科学の現場では前の回答、私は圏論は、型理論のための「基盤」であると述べました。ここで、もっと強いことを言いたいと思います。 カテゴリ理論は型理論です。逆に、型理論はカテゴリ理論です。これらの点について詳しく説明します。

カテゴリ理論は型理論です

型付きの正式な言語、および非公式表記を使用した通常の数学でさえ、型関数を宣言することになります。それは、とが「タイプ」と呼ばれるものであり、が1つのタイプから別のタイプへの「関数」であるという考え方であるという暗黙の記述です。カテゴリ理論は、そのような「タイプ」と「関数」の代数理論です。(公式には、カテゴリー理論はそれらを「オブジェクト」および「モーフィズム」と呼び、伝統主義者の集合論的なつま先を踏まないようにしますが、カテゴリー理論家が風に注意を払い、より直感的な用語を使用することがますます増えています: 「および「機能」。しかし、A B ff:ABABf

私たちは皆、高校から集合論で育ちました。そのため、やなどの型を集合として、などの関数を集合論的マッピングとして考えることに慣れています。あなたがそれらをそのように考えたことがないなら、あなたは良い体調にあります。セット理論的な脳洗浄から脱出しました。カテゴリー理論は、多くの種類のタイプと多くの種類の関数があると言います。したがって、セットとしての型の概念は制限されています。代わりに、カテゴリ理論は代数的方法で型と関数を公理化します。基本的に、それがカテゴリー理論です。型と機能の理論。高度な抽象化を伴う、非常に洗練されたものになります。しかし、それを学ぶことができれば、タイプと機能の深い理解を獲得できます。B fABf

型理論はカテゴリー理論です

「型理論」とは、すべての型がチェックされることを保証する用語形成の厳格な規則に基づいた、あらゆる種類の型付き言語を意味します。そのような言語で作業するときはいつでも、カテゴリー理論構造で作業していることがわかります。集合論的表記法を使用して集合論的に考えても、カテゴリー的に意味のあるものを書くことになります。それは驚くべき事実です。

歴史的に、Dana Scottはこれを最初に実現した可能性があります。彼は、型付き(および型なし)ラムダ計算に基づくプログラミング言語のセマンティックモデルの作成に取り組みました。プログラミング言語には、集合論に欠ける無制限の再帰が含まれるため、従来の集合論モデルはこの目的には不十分でした。スコットは、プログラミング現象を捕らえる一連のセマンティックモデルを発明し、ラムダ計算を、デカルト閉カテゴリーと呼ばれるカテゴリーのクラスを正確に表現することを実現しました。「集合論的」ではないデカルトの閉じたカテゴリがたくさんあります。ただし、型付きラムダ計算はそれらすべてに等しく適用されます。スコットは、「ラムダ計算の理論の関連付け」という素晴らしいエッセイを書きました。何が起こっているかを説明し、その一部はウェブ上で入手可能です。オリジナルの記事は、「To HB Curry:Essays on Combinatory Logic、Lambda Calculus and Formalism」、Academic Press、1980年と呼ばれる巻に掲載されました。 Curienはおそらく同じように、おそらく独立して実現しました。彼らは、これらのアイデアを関数型言語の実装に使用するカテゴリ抽象マシン(CAM)を定義し、MicrosoftのF#の基礎となるフレームワークである「CAML」と呼ばれました

、、などの標準型コンストラクターはファンクターです。これは、タイプをタイプにマップするだけでなく、タイプ間の機能をタイプ間の機能にもマップすることを意味します。 ポリモーフィック関数は、ファンクターアクションから生じるこのような関数をすべて保持します。カテゴリー理論は、1950年代にアイレンバーグとマクレーンによって発明されました。L i s t×List多態性関数の概念を正確に形式化する。それらは、型変数を使用して型を正しい方法で記述できる唯一のものであるため、それらを「自然変換」、「自然」と呼びました。したがって、カテゴリー言語は、プログラミング言語が登場する前であっても、ポリモーフィックプログラミング言語を形式化するために正確に考案されたと言えるかもしれません。

集合論的伝統主義者は、集合論的表記法を使用する際に表面下で行われるファンクターおよび自然な変換については知識がありません。しかし、彼が型システムを忠実に使用している限り、彼は本当にそれらを意識することなくカテゴリー構造を行っています。


カテゴリ理論とは、すべて完了し、タイプと機能の典型的な数学的理論です。そのため、すべてのプログラマー、特に機能的なプログラマーは、ちょっとしたカテゴリー理論を学ぶことで恩恵を受けることができます。残念ながら、特にプログラマーを対象としたカテゴリー理論に関する教科書はないようです。「コンピュータサイエンスのカテゴリ理論」の本は、通常、理論的なコンピュータサイエンスの学生/研究者を対象としています。ベンジャミン・ピアス著、コンピューター科学者向けの基本カテゴリー理論は、おそらく最も読みやすい本です。

ただし、Webには、プログラマを対象としたリソースがたくさんあります。Haskellwikiページが良い出発点となります。で、ミッドランド大学院、私たちは(特に)圏論の講義を持っています。グラハムハットンのコースは「初心者」コースとして、私の鉱山は「上級」コースとして固定されていました。しかし、どちらも本質的に同じコンテンツをカバーしており、深さは異なります。チャーマーズ大学には、世界中の書籍や講義ノートに関する素晴らしいリソースページがあります。「sigfpe」熱狂的なブログサイトも、プログラマーの観点から多くの良い直観を提供します。

学びたい基本的なトピックは次のとおりです。

  • カテゴリーの定義、およびカテゴリーのいくつかの例
  • ファンクター、およびそれらの例
  • 自然な変換とその例
  • 製品、連産品、指数(関数空間)、初期オブジェクトおよび端末オブジェクトの定義。
  • 付属物
  • モナド、代数、およびクライスリのカテゴリ

ミッドランズ大学院での私自身の講義ノートは、最後のトピック(モナド)を除くこれらすべてのトピックをカバーしています。最近、モナドに利用できる他のリソースがたくさんあります。それは大きな損失ではありません。

あなたが知っている数学が多ければ多いほど、カテゴリー理論を学ぶことはより簡単になるでしょう。カテゴリ理論は数学的構造の一般的な理論であるため、定義の意味を理解するためにいくつかの例を知っておくと役立ちます。(カテゴリー理論を学んだとき、プログラミング言語のセマンティクスの知識を使用して独自の例を作成する必要がありました。標準のテキストブックには数学的な例しかなく、それについては何も知りませんでした。)そしてスコットは「カテゴリー論理の紹介「カテゴリ理論と型システム(「ロジック」と呼ばれる)を関連付けたものです。多くの例を知らなくても、型システムに関連付けるだけでカテゴリ理論を理解することが可能になりました。カテゴリー理論を説明するアプローチ。


3
@UdayReddyカテゴリ理論と型理論の識別に強く反対します。現代の型理論は、実質的には同時実行プロセスの型、たとえばセッション型の理論の伝統に関するものです。私の知る限り、そのようなタイピングシステムのカテゴリ的な理解はありません。
マーティンバーガー

6
@MartinBerger「型理論」の解釈は少し狭いと思います。ただし、セッションタイプの適切なタイプ理論的およびカテゴリ理論的な理解は、現在、良い研究課題であり、時間を費やすつもりであることに同意します。
ウダイレディ

2
@MartinBerger。カテゴリ理論がより豊かな計算の概念にどのように適用されるかを見るために、命令型プログラミングの理論とゲームのセマンティクス(これも命令型計算を非常にうまくエンコードできる)にどのように適用されているかをご覧ください。ですから、関数型プログラミングがカテゴリー理論を独占しているとは思いません。
ウダイレディ

1
f:PQfPQ

2
「残念ながら、特にプログラマーを対象としたカテゴリー理論に関する教科書はないようです。」 このような「教科書」は、多かれ少なかれ、Bartosz Milewskiのプログラマ向けカテゴリ理論に存在します。Bartoszは、付随する講義シリーズも作成しました。
alx9r

30

私はそれを短くて甘いままにしてみます。Haskellプログラムと特定のカテゴリのカテゴリとの間には非公式の対応がありますが、これはいくつかの作業でより正式なものにできます。この通信は、Curry-Howard-Lambekの通信として知られており、以下に関連しています。

  1. カテゴリのオブジェクトを持つHaskell タイプ
  2. AB f:AB
  3. 初期オブジェクトを持つ代数データ型
  4. ファンクターを持つ型コンストラクター

リストは延々と続きますが、1つの重要なポイントは、カテゴリ理論でモナド代数のようなものを定義し、数学者に役立つだけでなくHaskellプログラミングの実践にも普及している概念を思いつくことができるということです。

コンピュータサイエンティスト向けのカテゴリに関する完全に満足のいく入門書が見つからなかったため、どの本を推奨すべきかわかりません。AspertiとLongoのカテゴリ、タイプ、構造を試すことができます。基本的な定義を付属物まで学び、それからこれらの概念を試して理解するためにいくつかの素晴らしいブログを読んでみてください。


1
「数学者に役立つだけでなく、Haskellプログラミングの実践にも普及している概念を考え出してください」-例を挙げてもらえますか?
ラファエル

7
@ラファエル:モナド。矢印。代数。炭代。
デイブクラーク

6
ファンクタは、二重性は、クライスリ圏、米田の補題は...
コーディ

4
デカルトはカテゴリを閉じました。カレー。
デイブクラーク

2
「ソフトウェアエンジニアのためのカテゴリ理論の紹介」、cs.toronto.edu /〜sme / presentations / cat101.pdf
Vladimir Alexiev 14年

29

@AJedのアドバイスを反映して、声明を提出することをお勧めします

I want to learn category theory so I can become better at Haskell.

頭の中で:プログラミングの直観に基づいてHaskellを学びます。FPの達人になると、カテゴリ理論を簡単に理解できるようになります(まだ気になっている場合)。

カテゴリ理論は、幅広い数学教育(グループ、リング、モジュール、ベクトル空間、トポロジなど)を持っている人にとっては簡単です。この背景がないため、カテゴリー理論はほとんど通用しません。カテゴリ理論の美しさは、一見無関係なものの多くを統合することです(例えば、忘れっぽいファンクターの左の随伴者は、自由群、普遍的な包絡代数、Stone-Cechコンパクト化、群のabelianisationsなど)。しかし、カテゴリー理論が統合する複数の例に精通していない場合、カテゴリー理論はあなたの人生をより困難にする複雑さの追加レイヤーにすぎません。

私の経験では、すでに知っていることを基に構築することで学習が容易になります。ソフトウェア開発者として、あなたはプログラミングについて多くのことを知っています。Haskellプログラミングは他のプログラミングとそれほど変わらないので、カテゴリー理論を無視して、実用的なプログラミングの観点からHaskellにアプローチすることをお勧めします。Haskellにあるちょっとしたカテゴリー理論、例えばモナドのサポートなどは、カテゴリー理論を迂回することなくプログラマーが理解するのがずっと簡単です。結局、モナドは単に一般化された構成にすぎません(そして、あなたがプログラミングの練習でモナドを既に使用しているでしょう-あなたがやったことを知らなくても)、そしてHaskellはモナドの法則を強制しないので、実際にはモナドを実際にサポートしていません。


7
いいえ、正直に言うと、Haskell 他のほとんどのプログラミング言語はまったく異なります。過去の先入観を取得することが多くの場合、最大の課題です。経験豊富なソフトウェア開発者は、これまでプログラミングしたことがない人よりも多くの問題を抱えているようです。
CAマッキャン

5
@CAMcCann私はあることに同意し、いくつかの経験豊富なプログラムはハスケルに例えばJavaやC#から移動する苦労を持っているように見えますが、私はHaskellの程度根本的に違うものがありますので、それはないと思います。部分的には違うように見えるからだと思います。Haskellを評価するためにカテゴリー理論を学ぶ必要があるという考えは、おそらくかなりの数の経験豊富なソフトウェア開発者がHaskellを習得するのを妨げているでしょう。(Cf. F#にモナドがないのはなぜですか。)他の言語にも似ていない多くのHaskellの機能を考えるのは難しいと思います。
マーティンバーガー

5
カテゴリー理論を知ることは少し助けになるかもしれませんが、それほどではありません。そして、それを学ぶことはHaskellを学ぶことより確かにずっと難しいです。ほとんどの言語(純度、非厳密な評価、型システム)と比較してかなり根本的な違いがあり、すべてのCT用語を削除しても、これらの用語はもはや馴染みのないものになります。一方、Haskellを学習すると、一部の人々はCTを学習するように動機付けられます。借りたアイデアが役立つからです。F#の制限された型システムと完全に適切な既存の用語の回避は、機能ではなく欠陥です。
CAマッキャン

1
Haskellに匹敵する型システムを持つScala以外の言語は知りません。経験的な観察から、純度はすぐには把握され、非厳密な評価(スキップしました)はさらに困難です。最後に、私プログラマーであり、この分野の誰も名前に脅かされることに異議を唱えています。ソフトウェア開発業界はすでに不透明な専門用語に満ちています。また、F#の型システムはモナドを直接表現できません。計算式は第一級ではないため、使用が大幅に制限されます。
CAマッキャン

2
CBNは概念的にも簡単です。たとえば、ほとんどのプログラマーが以前に使用していたはずの概念であるサンクの類推によってです。純度は、すべての働くプログラマーが理解しているものです。Haskellは、英国の学部教育で使用されています。生徒が関数型プログラミングを始める方法を私に尋ねるとき、私はしばしばHaskellを最初に学ぶことを勧めますが、生徒は質問の発信者であるようにその評判に怖がっています。これの主な理由は、Haskellのカテゴリー理論との関連だと思います。
マーティンバーガー

13

短い答え:いいえ[ただし、これは単なる意見です]

Haskellを上手に使うために、カテゴリー理論や他の理論領域に進まないでください。末尾再帰、マップ、リデュースなどの関数型プログラミング手法を学びます。できるだけ多くのコードを読んでください。できるだけ多くのアイデアを実装します。問題がある場合は、読んで読んでください。

Haskellおよびその他の関数型プログラミングパラダイムを学習するための優れた理論的リファレンスが必要な場合は、次を参照してください。...他にも似たような本があります。


1
怠atのため、Haskellでのプログラミングでは通常「末尾再帰」は重要ではないため、私はこれに眉をひそめます。それにもかかわらず、「やって学ぶ」ことはほとんど常に良いアドバイスです。
ダンバートン

@DanBurton ..興味深い観察。それでは、Haskellの代わりに、アーランやスキームを学んでみましょう:)。[私はHaskellの専門家ではありません。かっこいいから選んだだけです]
-AJed


0

カテゴリ理論は数学の非常に洗練された分野であり、それを習得することで、同じ抽象オブジェクトのインスタンスを作成することにより、以前の学習のほとんどを統一します。したがって、非常に便利で非常に直感的です。しかし、それは広大で広範であり、どれが自分のニーズに適しているのか、どれをスキップすべきなのかさえわからない、たくさんの新しい概念の中にいることに気付くでしょう。そのため、目的に合ったアプローチには概念の中から選択する必要があります。さもなければ、それを習得するには長い時間が必要であり、実際には自習領域ではありません。

ところで、私はあなたの目的がここにあるための非常によく出発点を提案します。


これは実際に質問に答えていません。関数型プログラミングを学ぶのに役立ちますか?カテゴリー理論のどのトピックがHaskellに役立つか?
デビッドリチャービー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.