読者です 読者をやめる 読者になる 読者になる

Creatable a => a -> IO b

Haskellと数学とちょびっと音楽

「圏論を学んで得られる事、得られない事」に対する補足

はいどうも、萌え豚にはなるまいと思っていた数年前の自分はどこへやら、今ではゆゆ式が生きがいのちゅーんさんです。

以前

こんな感じの記事を書きました所、主にブクマにて色々な意見を頂きまして、 色々と説明不足だったかなーという所もありましたので、補足のような記事を書くことにしました。

尚、本記事では、コメント欄やはてブに付けられたコメントを引用させて頂いております。 問題ありましたらはてブやコメント欄、あるいは僕のTwitterアカウントまでご連絡頂ければ、 対応致しますのでご一報ください。

何が言いたかったか

何度も言ってることですけど、これが伝わってないと話にならないので、 もう一度簡単に触れておきます。 この記事は読者に圏論を教えるためのブログ記事ではなく、 圏論とプログラミングの立ち位置を、伝える事が目的でした。

もともと、一部で「銀の弾丸」的なニュアンスで広まっている雰囲気がありましたので、 多少ネガティブなニュアンスで紹介してしまったが故に、余計に敬遠されている方も居たような気がしたので、 今回はもう少し、ポジティブな側面を紹介して行く事にしましょう。

知るべきか知らざるべきか

結論から言うと、「知るべき」です。

これは別に圏論に限らず、我々がエンジニアであれば、関連する技術/知識の中に「知らなくて良いこと」なんて無いのだという意味だと、 ご理解いただければと思います。 自戒を込めて。

と、

そんな感じのタテマエを前提とした上で、時間は有限ですから、もう少し現実的な目線から圏論を知るべきか、という話をします。 Haskellもくもく会なんかでお世話になっているigrepさんが、面白い事をおっしゃっていました。

igrep :
敢えてここで持論を述べるなら、プログラマにとっての圏論社会学者にとっての統計学みたいなもんだと思ってる。 詳しい仕組みを知るに越したことはないけど、知らなくても使えればいい。

社会学者にとっての統計学」というのは絶妙な例えだなーと思いました。 ただ、「社会学統計学」ならば「プログラミングと意味論」の方がよりニュアンスが近いかもしれない、という印象があります。 意味論について、なるべく平たく表現すると、「プログラミングの仕組み」を扱う計算機科学の一分野ですね。

「プログラミングの仕組み」というと、コンパイラアセンブリ機械語、んで、論理回路なんかをイメージする人が多いかもしれないですが、 (そしてそれも重要ではあるのですが)ここで言う「プログラミングの仕組み」とは、 「変数に代入するってどういう事?」とか「ループってどういう事?」みたいな、我々が「高級」と呼んでいる部分にスポットを当てて、 数学のノウハウを使ってその仕組みを再定義し、応用していこうという分野です。

そして意味論には、圏論の応用も含まれます。 関数型プログラミング言語の型システムと対応する圏論は、JavaC#が「関数型化」しつつある現代において、 決して「Haskellerだけのもの」ではなくなっているという事を述べておきましょう。

ラムダ式、カリー化、Maybe型(あるいはOption型)、これらはもはや関数型言語だけのものではありません。 これらの技術を有意に応用した設計を行うにあたり、 圏論は(直接的な力にはならないかもしれませんが)大いに「ヒント」となり得るのです。

amaliche:
まぁ実務で役立つ知識ではないし、色んな意味で近寄りがたい。

以上の事を踏まえ、「実務で役立つ知識ではない」は誤りなので訂正させて下さい。

知識として習得した上で、あなたの実務で役立たせる事が出来るか否かはあなた次第です。 先ほど申し上げましたように、 圏論はあなたの開発の設計に対して大いに「ヒント」となり得るものです。

「詳しい仕組みを知るに越したことはないけど、知らなくても使えればいい。 」はまさにそうなのですが、 「知っておくに越したことはない」程度には、プログラミングと強い関わりがあるという事は、認識したほうが良いかもしれません。

いかにして学ぶべきか

で、一番説明不足だったなぁと思ったのがこれ。

masarusanjp:
圏論、勉強したいんだけど、何をとっかかりにしていっていいかわからない。何か良い書籍ないかな

ですよねー、そうなりますよねー。

基本的に僕は、小学生の時にサンプルコードを使ってVB5の基本的な構文を覚えた程度には独学派なので、 大抵の事は、あっちこっちのWebサイトをつまみ読みし、自分で図式を書いて確認し、 Twitter有識者の方に訂正されながら細かい部分を固めていくような、わりと反面教師的な学習方法を取っているので、 なかなかこういう話をする時にスッと参考資料を出せないのはカコワルイです、精進します。

さて、とりあえず入門には、2013年にワークスアプリケーションズで開催された圏論勉強会の資料が比較的わかりやすいです。

この会にはひと通り参加していましたが、後半徐々に難易度が上がっていくので、 他の資料や書籍と合わせながら勉強していくと良いでしょう。

僕は読んでないのですが、日本語の文献では「圏論の基礎」が有名っぽい。

こっちも読んで無いですが、一番有名なのがCategory Theory (Oxford Logic Guides)

あと、「英語わからんー」とかいいながら、たまにパラパラめくってるのが、「圏論の薄い本」こと「Basic Category Theory for Computer Scientists」とか

あと、意味論の本ですが、「プログラム意味論 (情報数学講座) 」とか。すんませんまだ圏論の部分まで読めてないっす。うっす。

と、と、とりあえず知ってる主な情報元を並べてみましたけど、本人あっちこっちつまみ食いで覚えていった類なので、 どの書籍でどの順に読むと良いという明確なサポートが出来ないのはちょっと恥ずかしいぽよ。

前の記事については、

Cunliffe:
これ読むとかえってわからなくなるんじゃないかなあ。ちゃんと知ってる人に話聞かないとだめだよね、何事も。

と仰ってる方も居まして、いや圏論入門じゃないからそらそうだと思いつつ、「ちゃんと知ってる人」かと言われると自身なくなってくるので、 そういう不満のある方は、Twitterの数学クラスタやHaskellerが積極的に情報交換しているので、我々とjoinして一緒に学んでいってみては如何でしょう。

ただ、基本的に自習方式で、わからない部分をツイートすると、有識者が助け舟を出してくれる「かもしれない」とか、そういう感じだと思って下さい。 僕も含め、多くのコミュニティのメンバーは自分たちの知識を共有する事に抵抗はありませんが、何の準備もなく「教えて♡」って言ってくる人に教えるほど「ちゃんと知っている人達」は暇ではないので、学校とちがって他力本願だと何も情報入ってこないです。

参考までに、多少本格的な内容なので参考にはならないかもしれませんが、 僕がTLで圏論を教わってた時のTogetterまとめがあったので置いときます。 ゆるゆるっとした雰囲気が伝われば幸い。

なーにが「頭がパーンwww」じゃ落ち着け