圏論のオススメ勉強法（プログラマ向け）

この記事は、[iOSDC Japan 2018 で発表した「圏論とSwiftへの応用」の補足 - Qiita](https://qiita.com/inamiy/items/c4e85f22273e98b8db26) の続きです。

今回は、数学科でもコンピュータ科学出身でもない、単なるiOSエンジニアである筆者が、数学の **「圏論」** に興味を惹かれ、その流れで **[iOSDC Japan 2018](https://iosdc.jp/2018/)** で登壇発表に至るまでの、 **圏論のオススメ勉強法（プログラマ向け）** について紹介したいと思います。

登壇資料参考：

- [iOSDC Japan 2018 「圏論とSwiftへの応用」発表スライドメモ - Qiita](https://qiita.com/inamiy/items/3e0c10d5eaf234b41c3d)
- [iOSDC Japan 2018 で発表した「圏論とSwiftへの応用」の補足 - Qiita](https://qiita.com/inamiy/items/c4e85f22273e98b8db26)

## アジェンダ

1. 手元の圏論の本をそっと閉じる
2. Bartosz Milewski先生の動画を見る
3. iPad Pro と Apple Pencil で絵を描く

## 手元の圏論の本をそっと閉じる

![](https://qiita-image-store.s3.amazonaws.com/0/2249/5c8d956e-39d1-68f2-e3ab-983a93f05afe.jpeg)

巷には、圏論の名著といわれる入門書が何冊かあります。

- [圏論の基礎 by Saunders MacLane](https://www.amazon.co.jp/%E5%9C%8F%E8%AB%96%E3%81%AE%E5%9F%BA%E7%A4%8E-S-%E3%83%9E%E3%83%83%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%B3/dp/4621063243)
- [ベーシック圏論 普遍性からの速習コース by Tom Leinster](https://www.amazon.co.jp/%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF%E5%9C%8F%E8%AB%96-%E6%99%AE%E9%81%8D%E6%80%A7%E3%81%8B%E3%82%89%E3%81%AE%E9%80%9F%E7%BF%92%E3%82%B3%E3%83%BC%E3%82%B9-Tom-Leinster/dp/4621300709)
- [圏論 原著第2版 by Steve Awodey](https://www.amazon.co.jp/%E5%9C%8F%E8%AB%96-%E5%8E%9F%E8%91%97%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96-%E3%82%A2%E3%82%A6%E3%83%87%E3%82%A3/dp/432011115X) 

**[圏論の基礎](https://www.amazon.co.jp/%E5%9C%8F%E8%AB%96%E3%81%AE%E5%9F%BA%E7%A4%8E-S-%E3%83%9E%E3%83%83%E3%82%AF%E3%83%AC%E3%83%BC%E3%83%B3/dp/4621063243)** は、私が3年前に初めて購入した圏論本で、難易度はトップクラス。
「エンド・コエンド」や、有名な「すべての概念はカン拡張である」までカバーされている名著です。
最近は、Twitterで結城先生の [#圏論の基礎](https://twitter.com/search?q=%23%E5%9C%8F%E8%AB%96%E3%81%AE%E5%9F%BA%E7%A4%8E) ハッシュタグが賑わっているので、アップされたノートから雰囲気を知ることができます。
ちなみに私は、今でこそパラパラと本をめくれる程度にはなりましたが、購入当初は **冒頭6ページの「はじめに」を読んでいる途中で意識を失いました**。
それから約2年ほど、 **トラウマになって本が開けなくなった** のは良い思い出です。

**[ベーシック圏論](https://www.amazon.co.jp/%E3%83%99%E3%83%BC%E3%82%B7%E3%83%83%E3%82%AF%E5%9C%8F%E8%AB%96-%E6%99%AE%E9%81%8D%E6%80%A7%E3%81%8B%E3%82%89%E3%81%AE%E9%80%9F%E7%BF%92%E3%82%B3%E3%83%BC%E3%82%B9-Tom-Leinster/dp/4621300709)** は、次点で難しい本になります。
「極限」と「随伴」の解説に重点が置かれていて、後半になると図式が少ないのが辛かったです。
こちらも、1年前の購入当時は **「読者への注意」まで読めましたが「序論」で挫折しました** （そして、半年ほど封印）。

**[圏論 原著第2版 (Awodey本)](https://www.amazon.co.jp/%E5%9C%8F%E8%AB%96-%E5%8E%9F%E8%91%97%E7%AC%AC2%E7%89%88-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96-%E3%82%A2%E3%82%A6%E3%83%87%E3%82%A3/dp/432011115X)** は、上の2冊よりも易しく書かれた良書です。が、いかんせん、何回読んでも頭に入ってこない・・・
それもそのはず、Awodey本もまた、数学の具体例が中心で、 **プログラミングに直結する実践的な話が少ない** のです。
数学のバックグラウンドが無く、プログラミングのみの知識に頼らざるを得ない私のような立場の場合、これは致命的です。

また、個人的な不満として、どの本の中にも、 **描かれている図式が（紙面の都合上とはいえ）完成形で美しすぎるのが問題** だと思います。
[ふくろうの描き方](https://www.google.co.jp/search?q=%E3%81%B5%E3%81%8F%E3%82%8D%E3%81%86%E3%81%AE%E6%8F%8F%E3%81%8D%E6%96%B9&tbm=isch) を見せられて、「ね、簡単でしょ？」と言われている気分です。

圏論の醍醐味は、やはり「図式を描いて説明できる分かりやすさ」にあると思います。
そこで、 **Step-by-Stepで図式を描きながら、圏論を最短で学ぶ** 方法を見ていきましょう。
（そして、一旦騙されたと思って、 **目の前にある本はそっ閉じ** しましょう）

## Bartosz Milewski先生の動画を見る

<img width="904" src="https://qiita-image-store.s3.amazonaws.com/0/2249/86060533-4b3a-6f52-ffbe-ec289a0d2495.png">

圏論を効率良く学ぶ最良の方法は、 **講義動画を見て、図式が生き生きと語りかけてくる様を学ぶ** ことです。
おそらく、ネット上で一番有名なのが **Bartosz Milewski ([@BartoszMilewski](https://twitter.com/bartoszmilewski)) 先生** の動画ですが、現在進行形で「シリーズ3」が連載されています。

- [Category Theory 1.1: Motivation and Philosophy - YouTube](https://www.youtube.com/watch?v=I8LbkfSSR58&list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_)
- [Category Theory II 1.1: Declarative vs Imperative Approach - YouTube](https://www.youtube.com/watch?v=3XTQSx1A3x8&index=1&list=PLbgaMIhjbmElia1eCEZNvsVscFef9m0dm)
- [Category Theory III 1.1: Overview part 1 - YouTube](https://www.youtube.com/watch?v=F5uEpKwHqdk&list=PLbgaMIhjbmEn64WVX4B08B4h2rOtueWIL)

なんと素晴らしいことに、 どのシリーズも **無料で掲載されています！**
**ナレーションが英語のみ** なのが若干難点ですが、とてもゆっくりとした聞き取りやすい口調で、話し方もユーモアたっぷりで面白いので、英語の勉強がてら聞いてみることをオススメします。
また、プログラミング言語として **Haskellを使用している** ので、慣れていない場合は事前に予習しておくと良いでしょう。
（Haskellは、圏論関連のウェブサイトや論文で一番使われている言語なので、第二外国語として学んでおいて損はないです）

また、Milewski先生の動画の内容は、 **彼のブログや、有志作成によるPDF** にもまとまっています。
私は、 **[Category Theory for Programmers (PDF版、英語)](https://github.com/hmemcpy/milewski-ctfp-pdf)** から「余米田の補題」や「カン拡張」をようやく理解することができたので、こちらもオススメします。

- [Category Theory for Programmers: The Preface |   Bartosz Milewski's Programming Cafe](https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/)
- [hmemcpy/milewski-ctfp-pdf: Bartosz Milewski's 'Category Theory for Programmers' unofficial PDF and LaTeX source](https://github.com/hmemcpy/milewski-ctfp-pdf)

一旦、動画を見終わったら、Awodey本はすぐに理解できるようになると思います。
そして、少しずつ、本の中の図式の意味が読み取れるようになるでしょう。

## iPad Pro と Apple Pencil で絵を描く

・・・とはいえ、前述の動画をひと目見て、完全に理解するのはなかなか大変です。
そこで、動画を見る際には、必ずホワイトボードの **図式を模写する** ことを心がけましょう。

> 模写（もしゃ、英: reproduction, reproduce）とは、美術において、他者の作品を忠実に再現し、あるいはその作風を写し取ることでその作者の意図を体感・理解するための手段、方法。またその行為によって生み出されたもの。したがって模写には再現のための知識・技量が必要となる。
> [模写 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%A8%A1%E5%86%99)

図式を描かないことには、図式の意味を体感することはできません。

ちなみに図式の描き方ですが、なるべく **多くのカラー・ブラシ・アルファ等を使って、視覚に訴えかける図式を描く** と理解が進むと思います。
下の画像は、私の手書きノートの参考例ですが（汚すぎてすみません・・・）、それぞれの色やブラシに意味を持たせて、自分なりに解釈しやすくしています。

<img width="512" alt="note-kan-extension.png" src="https://qiita-image-store.s3.amazonaws.com/0/2249/b8fce640-cdaf-d765-938c-c481ca2c1494.png">

ちなみに、スラスラとノートが取れる最強のツールは、やはり [iPad Pro](https://www.apple.com/jp/ipad-pro/) と [Apple Pencil](https://www.apple.com/jp/shop/product/MK0C2J/A/apple-pencil) です。
アプリは、 [Adobe Photoshop Sketch](https://www.adobe.com/jp/products/sketch.html) を使っています。

## 最後に

以上のような紆余曲折を経て、圏論の学び方を変え、ようやく理解して[iOSDCで無事登壇した](https://qiita.com/inamiy/items/c4e85f22273e98b8db26)わけですが、当日発表を聞きに来て下さった @taketo1024 さんと意気投合して、
来月の10月16日(火)に、 **[プログラマのための圏論勉強会](https://cat4pg.connpass.com/event/100728/)** を開催する運びとなりました！

- [プログラマのための圏論勉強会 - connpass](https://cat4pg.connpass.com/event/100728/)

私は、 **「プログラマのためのモナド入門」** をテーマに、分かりやすいスライドを用意して話したいと思います。
圏論に興味のあるプログラマ・学生の方は、ぜひ奮ってご参加下さい😉