Scalaで圏論チョット学ぶ
by
ravineport
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
4DBMBͰݍŧŔŕŪֶͿ 4DBMBؔ4VNNJU 'SJOHFגࣜձࣾ ୩ޱ ܚҰ 1
Slide 2
Slide 2 text
ࣗݾհ ୩ޱ ܚҰ Fringe81גࣜձࣾ 新卒2年⽬ サーバサイドエンジニア ・広告プロダクトでScala書いてます ・数学をやっていた⼈ではありません ・Haskellもわかりません ⼈⽣初登壇! 2 twitter: @ravineport
Slide 3
Slide 3 text
ݍΛֶͿϞνϕʔγϣϯ 3 • Scalaに慣れてきたので、関数型ライブラリ(Scalaz, Cats)を触ってみる ??? よくわかんないけど⼀旦使うことはできるっぽいからいいか・・・ (とはいえ⼼にモヤモヤは残る) 圏論っていうのから来てるらしいぞ
Slide 4
Slide 4 text
ݍΛֶͿϞνϕʔγϣϯ 4 関数型ライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換 etc… 確かに 使っている 使う よくわからない世界 でも⾒え隠れしている 圏論学んでみよう!
Slide 5
Slide 5 text
ݍɺ৺ંΕ͕ͪ • ΠϯλʔωοτͰௐΔʢ͍͠ʣ 5 • 本で学ぶ(やっぱり難しい) ⼼が折れそうになりながらも なんとなく圏論の雰囲気は掴むことができた気がする ので、ここまでの学びを共有したいと思います
Slide 6
Slide 6 text
ࠓͷΰʔϧ 6 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる! ※ エンジニアのよく⾔う 「完全に理解した」→ 「全然わからん」 →「チョットわかる」の「チョットわかる」ではなく ⽂字通りの「チョットわかる」がゴールです
Slide 7
Slide 7 text
ࠓͷΰʔϧʢ͏গ͠۩ମྫʹʣ • ݍͰͷϞφυͷงғؾ͕Θ্͔ͬͨͰɺ ϓϩάϥϛϯάͰͲ͏׆͔͞Ε͍ͯΔͷ͔ΛͳΜͱͳ͘ײ͡Δ • ݁ՌɺݍͷงғؾΘ͔Δ • ݍ • ؔख • ࣗવม • ͳΜͱͳ͘Θ͔Δ͕ΰʔϧͳͷͰɺͦ͜·Ͱਖ਼֬ͳ͠ͳ͍ʢͰ͖ͳ͍ʣ 7
Slide 8
Slide 8 text
༐ؾΛग़ͯ͠ͱΓ͋͑ͣϞφυͷఆٛΛݟͯΈΔ 8 Wikipediaより
Slide 9
Slide 9 text
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 9 • 各種記号 • 圏 • 関⼿ • ⾃然変換
Slide 10
Slide 10 text
ݍͷجຊͱͳΔେͳ֓೦ • ݍʢDBUFHPSZʣ • ؔखʢGVODUPSʣ • ࣗવมʢOBUVSBMUSBOTGPSNBUJPOʣ 10 参考⽂献: ・圏論の道案内〜⽮印でえがく数学の世界〜 ・Category Theory for Programmers ・もう諦めない圏論⼊⾨
Slide 11
Slide 11 text
ݍʢDBUFHPSZʣ 11 対象(object)と射(arrow, morphism)からなるある種のシステム 圏の概念のイメージ図 対象Aから対象Bへの射f: 圏を構成するためには 満たすべきいくつかの規則がある fの域 dom(f) = A fの余域 cod(f) = B
Slide 12
Slide 12 text
ݍΛߏ͢ΔͨΊͷنଇ̍ɿ߹ 12 対象:オフィス、居酒屋、家 射:移動の仕⽅ オフィス 居酒屋 家 f g 「オフィスから居酒屋への射f」と「居酒屋から家への射g」から 「オフィスから家への射」 が得られる 対象:⼈ 射:友⼈関係 Aさん Bさん Cさん f g 定義できない
Slide 13
Slide 13 text
ݍΛߏ͢ΔͨΊͷنଇ̎ɿ݁߹ 13 のような任意のf, g, hについて が成り⽴つこと 図で表すと 合成する順番を⼊れ替えても結果は同じ 「域と余域がそれぞれ等しい射は互いに等しい」 が成り⽴っている図 ↑可換図式という
Slide 14
Slide 14 text
ݍΛߏ͢ΔͨΊͷنଇ̏ɿ߃ࣹ 14 どんな対象Aに対して、恒等射(identity)と呼ばれる特別な射1A がただ1つ存在し、 余域をAとする任意の射f、域をAとする任意の射gに対して 1A ◦f = f および g◦1A = gが成り⽴つ。 ⾔い換えると が可換(単位律という) オフィス 居酒屋 家 f g 恒等射 = 何もしない射 1居酒屋 1家 1オフィス 恒等射 = 移動しないという移動の仕⽅
Slide 15
Slide 15 text
ݍͷఆٛ·ͱΊ • ʮରʯͱʮࣹʯ • ʮҬʯʮ༨Ҭʯ͕ఆΊΒΕΔ • ʮ߹ʯ͕ఆΊΒΕΔ 15 fの域 dom(f) = A fの余域 cod(f) = B • 「結合律」が成り⽴つ • 「単位律」が成り⽴つ
Slide 16
Slide 16 text
4DBMBͷੈքͩͱ • ରɿܕ • ࣹɿؔ 16 イメージ図 もう少し簡潔にすると https://qiita.com/norkron/items/f90d851daf05a2efa567
Slide 17
Slide 17 text
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 17 • 各種記号 • 圏 • 関⼿ • ⾃然変換
Slide 18
Slide 18 text
ݍͷ࣍ɾɾɾ 18 圏の間の関係性、対応付けを考えることができそう 圏 圏D ? 圏Cの対象aは、圏Dの対象aʼに対応付けできて 圏Cの射fは、圏Dの射fʼに対応付けできて・・・みたいな
Slide 19
Slide 19 text
ݍ ͱݍ ͷରԠ͚ 19 D • 圏には合成という構造があるので、それを保つ対応付けをしたい • 対象と射の関係を保ちたい これが関⼿
Slide 20
Slide 20 text
圏 D ؔखʢGVODUPSʣ 20 圏 から への関⼿ とは , の任意の対象と射に対して、 の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ ()
Slide 21
Slide 21 text
圏 D ؔखʢGVODUPSʣ 21 圏 から への関⼿ とは , の任意の対象と射に対して、 の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ () 先に合成してから移す = 移してから合成する 対象aの恒等射を移すと 対象a (圏C)を移した 対象aʼ (圏D)の恒等射と同じ
Slide 22
Slide 22 text
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 22 • 各種記号 • 圏 • 関⼿ • ⾃然変換
Slide 23
Slide 23 text
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 23 • 各種記号 • 圏 • 関⼿ • ⾃然変換 ⾃分⾃⾝への関⼿ :⾃⼰関⼿
Slide 24
Slide 24 text
ݍ ͔Βݍ ʹෳͷؔख͕͋Δ߹ 24 D と の関係を考えられそう 圏 圏 それが⾃然変換の考え
Slide 25
Slide 25 text
ࣗવม 25 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射 を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
Slide 26
Slide 26 text
ࣗવม 26 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射 を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
Slide 27
Slide 27 text
ࣗવม 27 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射 を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
Slide 28
Slide 28 text
࠷ݶΒͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 28 • 各種記号 • 圏 • 関⼿ • ⾃然変換 雰囲気を理解する下地は整った・・・!
Slide 29
Slide 29 text
վΊͯϞφυͷఆٛ 29 圏 のモナドは 関⼿ ∘ = ∘ ∘ = ∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
Slide 30
Slide 30 text
݁߹ͱ୯ҐΛల։ͯ͠ΈΔ 30 圏 のモナドは 関⼿ ∘ = ∘ ∘ = ∘ = A ⾃然変換 ⾃然変換 以下の条件を満たす 結合律: 単位律: ( は圏 の恒等関⼿) から成り
Slide 31
Slide 31 text
݁߹ 31 関⼿ ∘ = ∘ ⾃然変換 ⾃然変換 後ろ2つを潰す 前2つを潰す 潰す順番に依らない
Slide 32
Slide 32 text
Ϟφυͷఆٛ 32 圏 のモナドは 関⼿ ∘ = ∘ ∘ = ∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
Slide 33
Slide 33 text
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 33 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する • 引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する
Slide 34
Slide 34 text
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 34 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する • 引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない
Slide 35
Slide 35 text
ϞφυͬͯϓϩάϥϛϯάͰͳΜͷʹཱͭͷʁ 35 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する • 引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない Moggi教授 「いくつかの計算効果はモナドとして捉えられる」
Slide 36
Slide 36 text
ࣦഊ͢Δ͔͠Εͳ͍ϓϩάϥϜΛѻ͏ 36 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿ (ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射
Slide 37
Slide 37 text
ࣦഊ͢Δ͔͠Εͳ͍ϓϩάϥϜΛѻ͏ 37 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿ (ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射 と を連結すると・・・ a None 失敗 成功 b None 失敗 成功 c なんかややこしい
Slide 38
Slide 38 text
Ϟφυͷ׆༂ 38 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、 を考えることができて さらにモナドの性質 から でも
Slide 39
Slide 39 text
͍ͧ͢͝Ϟφυʂͦͷ 39 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、 を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる!
Slide 40
Slide 40 text
͍ͧ͢͝Ϟφυʂͦͷ 40 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、 を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる! Some(b)かつ が成功したときにのみ型Cの値が返る ⾃然変換 が「すべて成功した場合」と「1つでも失敗した場合」にまとめてくれる!
Slide 41
Slide 41 text
4DBMBͰϞφυΛݟͯΈΔ 41 scala-hamsters/hamsters のMonad.scala
Slide 42
Slide 42 text
4DBMBͰϞφυΛݟͯΈΔ 42 scala-hamsters/hamsters のMonad.scala ⾃然変換
Slide 43
Slide 43 text
4DBMBͰϞφυΛݟͯΈΔ 43 scala-hamsters/hamsters のMonad.scala ⾃然変換 f: A => Box[B]を渡せば、Box[A] => Box[B]という関数 を にしてくれる感がある を に潰してもいる flatMap!
Slide 44
Slide 44 text
·ͱΊ • ݍͷجຊతͳ֓೦Λͳ͕Ίͨ • ݍ • ؔख • ࣗવม • Ϟφυͱͳʹ͔ɺͳΜͷʹཱͭͷ͔ • ܭࢉޮՌΛ͍͍ײ͡ʹѻ͑Δʂ 44 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!