Scalaで圏論チョット学ぶ

91df24fec10dee7549c21948e4ec4bc1?s=47 ravineport
October 26, 2019

 Scalaで圏論チョット学ぶ

91df24fec10dee7549c21948e4ec4bc1?s=128

ravineport

October 26, 2019
Tweet

Transcript

  1. 4DBMBͰݍ࿦ŧŔŕŪֶͿ 4DBMBؔ੢4VNNJU 'SJOHFגࣜձࣾ ୩ޱ ܚҰ࿠ 1

  2. ࣗݾ঺հ ୩ޱ ܚҰ࿠ Fringe81גࣜձࣾ 新卒2年⽬ サーバサイドエンジニア ・広告プロダクトでScala書いてます ・数学をやっていた⼈ではありません ・Haskellもわかりません ⼈⽣初登壇!

    2 twitter: @ravineport
  3. ݍ࿦ΛֶͿϞνϕʔγϣϯ 3 • Scalaに慣れてきたので、関数型ライブラリ(Scalaz, Cats)を触ってみる ??? よくわかんないけど⼀旦使うことはできるっぽいからいいか・・・ (とはいえ⼼にモヤモヤは残る) 圏論っていうのから来てるらしいぞ

  4. ݍ࿦ΛֶͿϞνϕʔγϣϯ 4 関数型ライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換

    etc… 確かに 使っている 使う よくわからない世界 でも⾒え隠れしている 圏論学んでみよう!
  5. ݍ࿦ɺ৺ંΕ͕ͪ໰୊ • ΠϯλʔωοτͰௐ΂Δʢ೉͍͠ʣ 5 • 本で学ぶ(やっぱり難しい) ⼼が折れそうになりながらも なんとなく圏論の雰囲気は掴むことができた気がする ので、ここまでの学びを共有したいと思います

  6. ࠓ೔ͷΰʔϧ 6 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿

    ・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる! ※ エンジニアのよく⾔う 「完全に理解した」→ 「全然わからん」 →「チョットわかる」の「チョットわかる」ではなく ⽂字通りの「チョットわかる」がゴールです
  7. ࠓ೔ͷΰʔϧʢ΋͏গ͠۩ମྫʹʣ • ݍ࿦ͰͷϞφυͷงғؾ͕Θ্͔ͬͨͰɺ ϓϩάϥϛϯάͰͲ͏׆͔͞Ε͍ͯΔͷ͔ΛͳΜͱͳ͘ײ͡Δ • ݁Ռɺݍ࿦ͷงғؾ΋Θ͔Δ • ݍ • ؔख

    • ࣗવม׵ • ͳΜͱͳ͘Θ͔Δ͕ΰʔϧͳͷͰɺͦ͜·Ͱਖ਼֬ͳ࿩͸͠ͳ͍ʢͰ͖ͳ͍ʣ 7
  8. ༐ؾΛग़ͯ͠ͱΓ͋͑ͣϞφυͷఆٛΛݟͯΈΔ 8 Wikipediaより

  9. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 9 • 各種記号 • 圏 • 関⼿ • ⾃然変換

  10. ݍ࿦ͷجຊͱͳΔେ੾ͳ֓೦ • ݍʢDBUFHPSZʣ • ؔखʢGVODUPSʣ • ࣗવม׵ʢOBUVSBMUSBOTGPSNBUJPOʣ 10 参考⽂献: ・圏論の道案内〜⽮印でえがく数学の世界〜

    ・Category Theory for Programmers ・もう諦めない圏論⼊⾨
  11. ݍʢDBUFHPSZʣ 11 対象(object)と射(arrow, morphism)からなるある種のシステム 圏の概念のイメージ図 対象Aから対象Bへの射f: 圏を構成するためには 満たすべきいくつかの規則がある fの域 dom(f)

    = A fの余域 cod(f) = B
  12. ݍΛߏ੒͢ΔͨΊͷنଇ̍ɿ߹੒ 12 対象:オフィス、居酒屋、家 射:移動の仕⽅ オフィス 居酒屋 家 f g 「オフィスから居酒屋への射f」と「居酒屋から家への射g」から

    「オフィスから家への射」 が得られる 対象:⼈ 射:友⼈関係 Aさん Bさん Cさん f g 定義できない
  13. ݍΛߏ੒͢ΔͨΊͷنଇ̎ɿ݁߹཯ 13 のような任意のf, g, hについて が成り⽴つこと 図で表すと 合成する順番を⼊れ替えても結果は同じ 「域と余域がそれぞれ等しい射は互いに等しい」 が成り⽴っている図

    ↑可換図式という
  14. ݍΛߏ੒͢ΔͨΊͷنଇ̏ɿ߃౳ࣹ 14 どんな対象Aに対して、恒等射(identity)と呼ばれる特別な射1A がただ1つ存在し、 余域をAとする任意の射f、域をAとする任意の射gに対して 1A ◦f = f および

    g◦1A = gが成り⽴つ。 ⾔い換えると が可換(単位律という) オフィス 居酒屋 家 f g 恒等射 = 何もしない射 1居酒屋 1家 1オフィス 恒等射 = 移動しないという移動の仕⽅
  15. ݍͷఆٛ·ͱΊ • ʮର৅ʯͱʮࣹʯ • ʮҬʯʮ༨Ҭʯ͕ఆΊΒΕΔ • ʮ߹੒ʯ͕ఆΊΒΕΔ 15 fの域 dom(f)

    = A fの余域 cod(f) = B • 「結合律」が成り⽴つ • 「単位律」が成り⽴つ
  16. 4DBMBͷੈքͩͱ • ର৅ɿܕ • ࣹɿؔ਺ 16 イメージ図 もう少し簡潔にすると https://qiita.com/norkron/items/f90d851daf05a2efa567

  17. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 17 • 各種記号 • 圏 • 関⼿ • ⾃然変換

  18. ݍͷ࣍͸ɾɾɾ 18 圏の間の関係性、対応付けを考えることができそう 圏 圏D ? 圏Cの対象aは、圏Dの対象aʼに対応付けできて 圏Cの射fは、圏Dの射fʼに対応付けできて・・・みたいな

  19. ݍ ͱݍ ͷରԠ෇͚ 19 D • 圏には合成という構造があるので、それを保つ対応付けをしたい • 対象と射の関係を保ちたい これが関⼿

  20. 圏 D ؔखʢGVODUPSʣ 20 圏 から への関⼿ とは , の任意の対象と射に対して、

    の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ ()
  21. 圏 D ؔखʢGVODUPSʣ 21 圏 から への関⼿ とは , の任意の対象と射に対して、

    の対象と射をそれぞれただ⼀つ定める対応付け また、以下を満たす となる任意の射 に対して 圏 の任意の対象 について 圏 1( = 1*(() 圏 圏D dom = cod() 圏D ∘ = () ∘ () 先に合成してから移す = 移してから合成する 対象aの恒等射を移すと 対象a (圏C)を移した 対象aʼ (圏D)の恒等射と同じ
  22. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 22 • 各種記号 • 圏 • 関⼿ • ⾃然変換

  23. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 23 • 各種記号 • 圏 • 関⼿ • ⾃然変換

    ⾃分⾃⾝への関⼿ :⾃⼰関⼿
  24. ݍ ͔Βݍ ʹෳ਺ͷؔख͕͋Δ৔߹ 24 D と の関係を考えられそう 圏 圏 それが⾃然変換の考え

  25. ࣗવม׵ 25 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射

    を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
  26. ࣗવม׵ 26 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射

    を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
  27. ࣗવม׵ 27 圏 圏 が関⼿ から関⼿ への⾃然変換とは は圏 の各対象 に対して、射

    を対応させる 圏 の任意の対象 , および任意の射 に対して → b ∘ ( = ; ∘ () が成り⽴つ
  28. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ 28 • 各種記号 • 圏 • 関⼿ • ⾃然変換

    雰囲気を理解する下地は整った・・・!
  29. վΊͯϞφυͷఆٛ 29 圏 のモナドは 関⼿ ∘ = ∘ ∘ =

    ∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
  30. ݁߹཯ͱ୯Ґ཯Λల։ͯ͠ΈΔ 30 圏 のモナドは 関⼿ ∘ = ∘ ∘ =

    ∘ = A ⾃然変換 ⾃然変換 以下の条件を満たす 結合律: 単位律: ( は圏 の恒等関⼿) から成り
  31. ݁߹཯ 31 関⼿ ∘ = ∘ ⾃然変換 ⾃然変換 後ろ2つを潰す 前2つを潰す

    潰す順番に依らない
  32. Ϟφυͷఆٛ 32 圏 のモナドは 関⼿ ∘ = ∘ ∘ =

    ∘ = A ⾃然変換 ⾃然変換 ( は圏 の恒等関⼿) から成り 以下の条件を満たす 結合律: 単位律:
  33. ϞφυͬͯϓϩάϥϛϯάͰͳΜͷ໾ʹཱͭͷʁ 33 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •

    引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する
  34. ϞφυͬͯϓϩάϥϛϯάͰͳΜͷ໾ʹཱͭͷʁ 34 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •

    引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない
  35. ϞφυͬͯϓϩάϥϛϯάͰͳΜͷ໾ʹཱͭͷʁ 35 計算効果(の⼀部)をモナドで扱うことができる 計算過程で発⽣する計算以外の部分のこと ex. データベースの検索の失敗 • ⼊⼒された⼈名を電話帳で検索して電話番号を返すプログラムは、 存在しない⼈名が⼊⼒されると失敗する •

    引いてきた電話番号を別のプログラムに使おうとすると問題は連鎖する 「値」から「値」への計算に集中したいけど、実際は 「失敗かもしれない値」から「失敗かもしれない値」へのプログラムにしないといけない Moggi教授 「いくつかの計算効果はモナドとして捉えられる」
  36. ࣦഊ͢Δ͔΋͠Εͳ͍ϓϩάϥϜΛѻ͏ 36 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿

    (ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射
  37. ࣦഊ͢Δ͔΋͠Εͳ͍ϓϩάϥϜΛѻ͏ 37 この計算効果に対応するのがMaybe モナド Maybe モナド: プログラム :型Aを受け取って、成功したら型Bを返す ← 関⼿

    (ScalaならOption型) 射 型Aの値a、型Bの値bとして aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None プログラム :射 と を連結すると・・・ a None 失敗 成功 b None 失敗 成功 c なんかややこしい
  38. Ϟφυͷ׆༂ 38 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、

    を考えることができて さらにモナドの性質 から でも
  39. ͍ͧ͢͝Ϟφυʂͦͷ 39 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、

    を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる!
  40. ͍ͧ͢͝Ϟφυʂͦͷ 40 Q. なぜややこしいのか? の出⼒と の⼊⼒が合っていないから A. モナド () は関⼿なので、

    を考えることができて さらにモナドの性質 から でも この拡張をモナドがやってくれる! Some(b)かつ が成功したときにのみ型Cの値が返る ⾃然変換 が「すべて成功した場合」と「1つでも失敗した場合」にまとめてくれる!
  41. 4DBMBͰϞφυΛݟͯΈΔ 41 scala-hamsters/hamsters のMonad.scala

  42. 4DBMBͰϞφυΛݟͯΈΔ 42 scala-hamsters/hamsters のMonad.scala ⾃然変換

  43. 4DBMBͰϞφυΛݟͯΈΔ 43 scala-hamsters/hamsters のMonad.scala ⾃然変換 f: A => Box[B]を渡せば、Box[A] =>

    Box[B]という関数 を にしてくれる感がある を に潰してもいる flatMap!
  44. ·ͱΊ • ݍ࿦ͷجຊతͳ֓೦Λͳ͕Ίͨ • ݍ • ؔख • ࣗવม׵ •

    Ϟφυͱ͸ͳʹ͔ɺͳΜͷ໾ʹཱͭͷ͔ • ܭࢉޮՌΛ͍͍ײ͡ʹѻ͑Δʂ 44 関数型プログラミング のライブラリ ・Scalaz ・Cats etc… 圏論 ・圏 ・関⼿ ・⾃然変換 etc… 概念を 使っている 使う ⾒え隠れしても怖くない! チョットわかる!