私はHaskellを学んでおり、その言語に魅了されています。しかし、私には深刻な数学やCSのバックグラウンドはありません。しかし、私は経験豊富なソフトウェアプログラマです。
Haskellでより良くなるために、カテゴリー理論を学びたいです。
Haskellを理解するための良い基礎を提供するために、カテゴリー理論のどのトピックを学ぶべきですか?
私はHaskellを学んでおり、その言語に魅了されています。しかし、私には深刻な数学やCSのバックグラウンドはありません。しかし、私は経験豊富なソフトウェアプログラマです。
Haskellでより良くなるために、カテゴリー理論を学びたいです。
Haskellを理解するための良い基礎を提供するために、カテゴリー理論のどのトピックを学ぶべきですか?
回答:
では理論計算機科学の現場では前の回答、私は圏論は、型理論のための「基盤」であると述べました。ここで、もっと強いことを言いたいと思います。 カテゴリ理論は型理論です。逆に、型理論はカテゴリ理論です。これらの点について詳しく説明します。
カテゴリ理論は型理論です
型付きの正式な言語、および非公式表記を使用した通常の数学でさえ、型関数を宣言することになります。それは、とが「タイプ」と呼ばれるものであり、が1つのタイプから別のタイプへの「関数」であるという考え方であるという暗黙の記述です。カテゴリ理論は、そのような「タイプ」と「関数」の代数理論です。(公式には、カテゴリー理論はそれらを「オブジェクト」および「モーフィズム」と呼び、伝統主義者の集合論的なつま先を踏まないようにしますが、カテゴリー理論家が風に注意を払い、より直感的な用語を使用することがますます増えています: 「および「機能」。しかし、A B f
私たちは皆、高校から集合論で育ちました。そのため、やなどの型を集合として、などの関数を集合論的マッピングとして考えることに慣れています。あなたがそれらをそのように考えたことがないなら、あなたは良い体調にあります。セット理論的な脳洗浄から脱出しました。カテゴリー理論は、多くの種類のタイプと多くの種類の関数があると言います。したがって、セットとしての型の概念は制限されています。代わりに、カテゴリ理論は代数的方法で型と関数を公理化します。基本的に、それがカテゴリー理論です。型と機能の理論。高度な抽象化を伴う、非常に洗練されたものになります。しかし、それを学ぶことができれば、タイプと機能の深い理解を獲得できます。B f
型理論はカテゴリー理論です
「型理論」とは、すべての型がチェックされることを保証する用語形成の厳格な規則に基づいた、あらゆる種類の型付き言語を意味します。そのような言語で作業するときはいつでも、カテゴリー理論構造で作業していることがわかります。集合論的表記法を使用して集合論的に考えても、カテゴリー的に意味のあるものを書くことになります。それは驚くべき事実です。
歴史的に、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多態性関数の概念を正確に形式化する。それらは、型変数を使用して型を正しい方法で記述できる唯一のものであるため、それらを「自然変換」、「自然」と呼びました。したがって、カテゴリー言語は、プログラミング言語が登場する前であっても、ポリモーフィックプログラミング言語を形式化するために正確に考案されたと言えるかもしれません。
集合論的伝統主義者は、集合論的表記法を使用する際に表面下で行われるファンクターおよび自然な変換については知識がありません。しかし、彼が型システムを忠実に使用している限り、彼は本当にそれらを意識することなくカテゴリー構造を行っています。
カテゴリ理論とは、すべて完了し、タイプと機能の典型的な数学的理論です。そのため、すべてのプログラマー、特に機能的なプログラマーは、ちょっとしたカテゴリー理論を学ぶことで恩恵を受けることができます。残念ながら、特にプログラマーを対象としたカテゴリー理論に関する教科書はないようです。「コンピュータサイエンスのカテゴリ理論」の本は、通常、理論的なコンピュータサイエンスの学生/研究者を対象としています。ベンジャミン・ピアス著、コンピューター科学者向けの基本カテゴリー理論は、おそらく最も読みやすい本です。
ただし、Webには、プログラマを対象としたリソースがたくさんあります。Haskellwikiページが良い出発点となります。で、ミッドランド大学院、私たちは(特に)圏論の講義を持っています。グラハムハットンのコースは「初心者」コースとして、私の鉱山は「上級」コースとして固定されていました。しかし、どちらも本質的に同じコンテンツをカバーしており、深さは異なります。チャーマーズ大学には、世界中の書籍や講義ノートに関する素晴らしいリソースページがあります。「sigfpe」の熱狂的なブログサイトも、プログラマーの観点から多くの良い直観を提供します。
学びたい基本的なトピックは次のとおりです。
ミッドランズ大学院での私自身の講義ノートは、最後のトピック(モナド)を除くこれらすべてのトピックをカバーしています。最近、モナドに利用できる他のリソースがたくさんあります。それは大きな損失ではありません。
あなたが知っている数学が多ければ多いほど、カテゴリー理論を学ぶことはより簡単になるでしょう。カテゴリ理論は数学的構造の一般的な理論であるため、定義の意味を理解するためにいくつかの例を知っておくと役立ちます。(カテゴリー理論を学んだとき、プログラミング言語のセマンティクスの知識を使用して独自の例を作成する必要がありました。標準のテキストブックには数学的な例しかなく、それについては何も知りませんでした。)そしてスコットは「カテゴリー論理の紹介「カテゴリ理論と型システム(「ロジック」と呼ばれる)を関連付けたものです。多くの例を知らなくても、型システムに関連付けるだけでカテゴリ理論を理解することが可能になりました。カテゴリー理論を説明するアプローチ。
私はそれを短くて甘いままにしてみます。Haskellプログラムと特定のカテゴリのカテゴリとの間には非公式の対応がありますが、これはいくつかの作業でより正式なものにできます。この通信は、Curry-Howard-Lambekの通信として知られており、以下に関連しています。
リストは延々と続きますが、1つの重要なポイントは、カテゴリ理論でモナドや代数のようなものを定義し、数学者に役立つだけでなくHaskellプログラミングの実践にも普及している概念を思いつくことができるということです。
コンピュータサイエンティスト向けのカテゴリに関する完全に満足のいく入門書が見つからなかったため、どの本を推奨すべきかわかりません。AspertiとLongoのカテゴリ、タイプ、構造を試すことができます。基本的な定義を付属物まで学び、それからこれらの概念を試して理解するためにいくつかの素晴らしいブログを読んでみてください。
@AJedのアドバイスを反映して、声明を提出することをお勧めします
I want to learn category theory so I can become better at Haskell.
頭の中で:プログラミングの直観に基づいてHaskellを学びます。FPの達人になると、カテゴリ理論を簡単に理解できるようになります(まだ気になっている場合)。
カテゴリ理論は、幅広い数学教育(グループ、リング、モジュール、ベクトル空間、トポロジなど)を持っている人にとっては簡単です。この背景がないため、カテゴリー理論はほとんど通用しません。カテゴリ理論の美しさは、一見無関係なものの多くを統合することです(例えば、忘れっぽいファンクターの左の随伴者は、自由群、普遍的な包絡代数、Stone-Cechコンパクト化、群のabelianisationsなど)。しかし、カテゴリー理論が統合する複数の例に精通していない場合、カテゴリー理論はあなたの人生をより困難にする複雑さの追加レイヤーにすぎません。
私の経験では、すでに知っていることを基に構築することで学習が容易になります。ソフトウェア開発者として、あなたはプログラミングについて多くのことを知っています。Haskellプログラミングは他のプログラミングとそれほど変わらないので、カテゴリー理論を無視して、実用的なプログラミングの観点からHaskellにアプローチすることをお勧めします。Haskellにあるちょっとしたカテゴリー理論、例えばモナドのサポートなどは、カテゴリー理論を迂回することなくプログラマーが理解するのがずっと簡単です。結局、モナドは単に一般化された構成にすぎません(そして、あなたがプログラミングの練習でモナドを既に使用しているでしょう-あなたがやったことを知らなくても)、そしてHaskellはモナドの法則を強制しないので、実際にはモナドを実際にサポートしていません。
短い答え:いいえ[ただし、これは単なる意見です]
Haskellを上手に使うために、カテゴリー理論や他の理論領域に進まないでください。末尾再帰、マップ、リデュースなどの関数型プログラミング手法を学びます。できるだけ多くのコードを読んでください。できるだけ多くのアイデアを実装します。問題がある場合は、読んで読んでください。
Haskellおよびその他の関数型プログラミングパラダイムを学習するための優れた理論的リファレンスが必要な場合は、次を参照してください。...他にも似たような本があります。
カテゴリー理論のアイデアが実際のプログラミングにどのように関連するかについての動機付けを与える(長い)ブログ投稿です:http : //cdsmith.wordpress.com/2012/04/18/why-do-monads-matter/
カテゴリ理論は数学の非常に洗練された分野であり、それを習得することで、同じ抽象オブジェクトのインスタンスを作成することにより、以前の学習のほとんどを統一します。したがって、非常に便利で非常に直感的です。しかし、それは広大で広範であり、どれが自分のニーズに適しているのか、どれをスキップすべきなのかさえわからない、たくさんの新しい概念の中にいることに気付くでしょう。そのため、目的に合ったアプローチには概念の中から選択する必要があります。さもなければ、それを習得するには長い時間が必要であり、実際には自習領域ではありません。
ところで、私はあなたの目的がここにあるための非常によく出発点を提案します。