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… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!