Haskell勉強会

関数型プログラミングの学習日記

モナドの説明図

モナドの説明図で分かりやすい図がありました。(メモ)

後で深掘りしてみたいと思います。

 

www.cs-study.com

 

1.モナド (Monads)

f:id:hamamuratakuo:20190908121729p:plain

モナドは,関数型言語副作用を閉じ込めるのに使われているという触れ込みなどでプログラマの関心を集めています.

ここでは,モナドに関する色々な文献とその内容を調べてみます. 対象としては,特に関数型言語モナドの使い方には限りません(でも,そこから始めます).

一応,定義としては,圏 C から C への自己関手 T に対して,C のオブジェクトXをT(C) のオブジェクトT(X)へ「変換」する自然変換ηとT2(X) = T(T(X))のように T がネストしてしまったオブジェクトを T(C) のオブジェクトにほどく自然変換μが存在して,それらがモノイドの条件に似たある条件を満たすときに,(T, η, μ)をモナドと言います.

 

この説明に対応する内容が、JavaScriptの場合を例にして紹介されていました。

 

kentutorialbook.github.io

 

4. モナド(Monad)とは何か?

全部がモナドではないが一部は確実にモナドである、という事例として、最近のJavaScriptのArrayがあげられます。

まずは、Array のモナドではない部分を復習して、それからモナドである部分を紹介します。

 

f:id:hamamuratakuo:20190907094355p:plain

 

4.6. モナド(Monad)

なんのことはない、Array で言えば、普通の Array.map に Array.flat を付け加えたものがモナドになります。 unit というのは、[] なので最初からあるといえばありました。

 

上記の説明を参考にすると、JavaScriptのArrayの場合で、

 

[ 7 ]

↑↓

[ [ 7 ] ]

↑↓

[ [ [ 7 ] ] ]

 

というArray.mapの変換(これが自己関手Tに相当)があった場合、

 

  • ↑:flat (これが自然変換μに相当)
  • ↓:unit (これが自然変換ηに相当)

 

が加わることによって、(T, η, μ)がモナドとなる。

Array.mapにArray.unitとArray.flatが加わることで、モナドとして機能する。

ということですね?

 

C 上のモナドとは、

  • 自己函手 T: C→C
  • 自然変換 η: IdC⇒T
  • 自然変換 μ: T∘T⇒T

からなる3つ組 ⟨T,η,μ⟩

などと表記されることが多いです。

 

何となく分かったような、分からないような気分になりますが、後は具体的なモナドの使い方をマスターすることが必要ですね。

 

【追記】2019-09-08

YouTubeの動画を見ていたら、他にも似た図があったので追記。

 

www.youtube.com

 

この動画のスライド

 

speakerdeck.com

 

動画の23分あたり、スライドの88ページ目の図が、自然変換μや自然変換ηに相当していました。

 

f:id:hamamuratakuo:20190908164102j:plain

 

その他、参考情報

他にも検索してるときに、参考になりそうな情報があったのでメモ。(順不同)

 

圏論の歩き方

圏論の歩き方

 

 

この本のAmazonレビューで、圏論の学び方について提案がありました。

 

www.amazon.co.jp

 

まずはネットで「圏論を勉強しよう」を読んでからがお薦めです。
you tubeの大森 健児さんの解説をみて「プログラマーのための圏論(上)」PDFを読むとかなり解ってきます。

 

scrapbox.io

 

www.youtube.com

 

大森健児さんの説明は、親しみやすかったです。

 

www.youtube.com

 

www.slideshare.net

 

f:id:hamamuratakuo:20190913160017j:plain

 

このスライドで右側にある「モナド 実世界 ←→ 純粋な世界」という部分が肝です。

 

bitterharvest.hatenablog.com

 

圏論トポロジーから出てきた概念?

 

www.orecoli.com

 

私が圏論という分野を知るきっかけは、おそらくこの文章を読んでいるほとんどの人と同様に Haskell の勉強をしたことがきっかけでした。

Haskellモナドなどを利用する上では圏論を理解する必要は全くないのですが、型システムや処理系に関して詳しく知りたくて論文を読むと圏論の言葉が普通に使われていて、理解できずに断念していました。

 

代数的トポロジーの成果から図形的な内容を削ぎ落として、純粋に代数的な内容のみを取り出した分野がホモロジー代数です。圏論は、代数的トポロジーの研究の中で生じてきた概念だと言われています。ホモロジー代数の書籍では、圏の定義が登場し実際に利用します。ホモロジー代数の勉強を通して、圏論を実際に利用する感覚を身につけることができるでしょう。

 

ja.wikipedia.org

 

代数的位相幾何学(だいすうてきいそうきかがく、英語:algebraic topology、代数的トポロジー)は代数的手法を用いる位相幾何学の分野のことをいう。

古典的な位相幾何学は、図形として取り扱い易い多面体を扱っていたが、1900年前後のポワンカレの一連の研究を契機として20世紀に発展した。

ポワンカレは 1895年に出版した "Analysis Situs" の中で、ホモトピーおよびホモロジーの概念を導入した。

これらはいまや代数的位相幾何学の大きな柱であると考えられている。

多様体、基本群、ホモトピーホモロジーコホモロジー、ファイバー束などの、位相空間の不変量として代数系を対応させ、位相的性質を代数的性質に移して研究する.

 

圏論は、数学的知識が背景にないと、具体的な内容がピンと来ないものみたいですね。

とりあえず、プログラミングでモナドを活用したい場合は、事例を限定して、最小限の知識で理解できればOKだと思います。

 

時間があれば、圏論の背景にある位相幾何学を勉強してみればいいかな?