Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Scalaで圏論チョット学ぶ

ravineport
October 26, 2019

 Scalaで圏論チョット学ぶ

ravineport

October 26, 2019
Tweet

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. ݍ࿦ΛֶͿϞνϕʔγϣϯ
    4
    関数型ライブラリ
    ・Scalaz
    ・Cats
    etc…
    圏論
    ・圏
    ・関⼿
    ・⾃然変換
    etc…
    確かに
    使っている
    使う
    よくわからない世界
    でも⾒え隠れしている
    圏論学んでみよう!

    View full-size slide

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

    View full-size slide

  6. ࠓ೔ͷΰʔϧ
    6
    関数型プログラミング
    のライブラリ
    ・Scalaz
    ・Cats
    etc…
    圏論
    ・圏
    ・関⼿
    ・⾃然変換
    etc…
    概念を
    使っている
    使う
    ⾒え隠れしても怖くない!
    チョットわかる!
    ※ エンジニアのよく⾔う
    「完全に理解した」→ 「全然わからん」 →「チョットわかる」の「チョットわかる」ではなく
    ⽂字通りの「チョットわかる」がゴールです

    View full-size slide

  7. ࠓ೔ͷΰʔϧʢ΋͏গ͠۩ମྫʹʣ
    • ݍ࿦ͰͷϞφυͷงғؾ͕Θ্͔ͬͨͰɺ
    ϓϩάϥϛϯάͰͲ͏׆͔͞Ε͍ͯΔͷ͔ΛͳΜͱͳ͘ײ͡Δ
    • ݁Ռɺݍ࿦ͷงғؾ΋Θ͔Δ
    • ݍ
    • ؔख
    • ࣗવม׵
    • ͳΜͱͳ͘Θ͔Δ͕ΰʔϧͳͷͰɺͦ͜·Ͱਖ਼֬ͳ࿩͸͠ͳ͍ʢͰ͖ͳ͍ʣ
    7

    View full-size slide

  8. ༐ؾΛग़ͯ͠ͱΓ͋͑ͣϞφυͷఆٛΛݟͯΈΔ
    8
    Wikipediaより

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  12. ݍΛߏ੒͢ΔͨΊͷنଇ̍ɿ߹੒
    12
    対象:オフィス、居酒屋、家
    射:移動の仕⽅
    オフィス
    居酒屋

    f g
    「オフィスから居酒屋への射f」と「居酒屋から家への射g」から
    「オフィスから家への射」 が得られる
    対象:⼈
    射:友⼈関係
    Aさん
    Bさん
    Cさん
    f g
    定義できない

    View full-size slide

  13. ݍΛߏ੒͢ΔͨΊͷنଇ̎ɿ݁߹཯
    13
    のような任意のf, g, hについて が成り⽴つこと
    図で表すと
    合成する順番を⼊れ替えても結果は同じ
    「域と余域がそれぞれ等しい射は互いに等しい」
    が成り⽴っている図
    ↑可換図式という

    View full-size slide

  14. ݍΛߏ੒͢ΔͨΊͷنଇ̏ɿ߃౳ࣹ
    14
    どんな対象Aに対して、恒等射(identity)と呼ばれる特別な射1A
    がただ1つ存在し、
    余域をAとする任意の射f、域をAとする任意の射gに対して 1A
    ◦f = f および g◦1A
    = gが成り⽴つ。
    ⾔い換えると が可換(単位律という)
    オフィス
    居酒屋

    f g
    恒等射 = 何もしない射
    1居酒屋
    1家
    1オフィス
    恒等射 = 移動しないという移動の仕⽅

    View full-size slide

  15. ݍͷఆٛ·ͱΊ
    • ʮର৅ʯͱʮࣹʯ
    • ʮҬʯʮ༨Ҭʯ͕ఆΊΒΕΔ
    • ʮ߹੒ʯ͕ఆΊΒΕΔ
    15
    fの域 dom(f) = A
    fの余域 cod(f) = B
    • 「結合律」が成り⽴つ • 「単位律」が成り⽴つ

    View full-size slide

  16. 4DBMBͷੈքͩͱ
    • ର৅ɿܕ
    • ࣹɿؔ਺
    16
    イメージ図
    もう少し簡潔にすると
    https://qiita.com/norkron/items/f90d851daf05a2efa567

    View full-size slide

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

    View full-size slide

  18. ݍͷ࣍͸ɾɾɾ
    18
    圏の間の関係性、対応付けを考えることができそう
    圏 圏D

    圏Cの対象aは、圏Dの対象aʼに対応付けできて
    圏Cの射fは、圏Dの射fʼに対応付けできて・・・みたいな

    View full-size slide

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

    View full-size slide

  20. 圏 D
    ؔखʢGVODUPSʣ
    20
    圏 から への関⼿ とは
    ,

    の任意の対象と射に対して、 の対象と射をそれぞれただ⼀つ定める対応付け
    また、以下を満たす
    となる任意の射 に対して
    圏 の任意の対象 について

    1(
    = 1*(()
    圏 圏D

    dom = cod()
    圏D
    ∘ = () ∘ ()

    View full-size slide

  21. 圏 D
    ؔखʢGVODUPSʣ
    21
    圏 から への関⼿ とは
    ,

    の任意の対象と射に対して、 の対象と射をそれぞれただ⼀つ定める対応付け
    また、以下を満たす
    となる任意の射 に対して
    圏 の任意の対象 について

    1(
    = 1*(()
    圏 圏D

    dom = cod()
    圏D
    ∘ = () ∘ ()

    先に合成してから移す

    移してから合成する
    対象aの恒等射を移すと
    対象a (圏C)を移した
    対象aʼ (圏D)の恒等射と同じ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. ݍ ͔Βݍ ʹෳ਺ͷؔख͕͋Δ৔߹
    24
    D

    と の関係を考えられそう
    圏 圏

    それが⾃然変換の考え

    View full-size slide

  25. ࣗવม׵
    25
    圏 圏

    が関⼿ から関⼿ への⾃然変換とは

    は圏 の各対象 に対して、射 を対応させる
    圏 の任意の対象 , および任意の射 に対して

    → b

    ∘ (
    = ;
    ∘ () が成り⽴つ

    View full-size slide

  26. ࣗવม׵
    26
    圏 圏

    が関⼿ から関⼿ への⾃然変換とは

    は圏 の各対象 に対して、射 を対応させる
    圏 の任意の対象 , および任意の射 に対して

    → b

    ∘ (
    = ;
    ∘ () が成り⽴つ

    View full-size slide

  27. ࣗવม׵
    27
    圏 圏

    が関⼿ から関⼿ への⾃然変換とは

    は圏 の各対象 に対して、射 を対応させる
    圏 の任意の対象 , および任意の射 に対して

    → b

    ∘ (
    = ;
    ∘ () が成り⽴つ

    View full-size slide

  28. ࠷௿ݶ஌Βͳ͍ͱ͍͚ͳ͍ͱ͜Ζ
    28
    • 各種記号
    • 圏
    • 関⼿
    • ⾃然変換
    雰囲気を理解する下地は整った・・・!

    View full-size slide

  29. վΊͯϞφυͷఆٛ
    29
    圏 のモナドは
    関⼿
    ∘ = ∘ ∘ = ∘ = A
    ⾃然変換
    ⾃然変換
    ( は圏 の恒等関⼿)
    から成り
    以下の条件を満たす
    結合律: 単位律:

    View full-size slide

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

    View full-size slide

  31. ݁߹཯
    31
    関⼿
    ∘ = ∘
    ⾃然変換
    ⾃然変換
    後ろ2つを潰す
    前2つを潰す
    潰す順番に依らない

    View full-size slide

  32. Ϟφυͷఆٛ
    32
    圏 のモナドは
    関⼿
    ∘ = ∘ ∘ = ∘ = A
    ⾃然変換
    ⾃然変換
    ( は圏 の恒等関⼿)
    から成り
    以下の条件を満たす
    結合律: 単位律:

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    型Aの値a、型Bの値bとして
    aを受け取って成功すれば f(a) = Some(a)、失敗すればf(a) = None
    プログラム :射

    View full-size slide

  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 なんかややこしい

    View full-size slide

  38. Ϟφυͷ׆༂
    38
    Q. なぜややこしいのか?

    の出⼒と の⼊⼒が合っていないから
    A.
    モナド ()
    は関⼿なので、 を考えることができて
    さらにモナドの性質 から
    でも

    View full-size slide

  39. ͍ͧ͢͝Ϟφυʂͦͷ
    39
    Q. なぜややこしいのか?

    の出⼒と の⼊⼒が合っていないから
    A.
    モナド ()
    は関⼿なので、 を考えることができて
    さらにモナドの性質 から
    でも
    この拡張をモナドがやってくれる!

    View full-size slide

  40. ͍ͧ͢͝Ϟφυʂͦͷ
    40
    Q. なぜややこしいのか?

    の出⼒と の⼊⼒が合っていないから
    A.
    モナド ()
    は関⼿なので、 を考えることができて
    さらにモナドの性質 から
    でも
    この拡張をモナドがやってくれる!
    Some(b)かつ が成功したときにのみ型Cの値が返る
    ⾃然変換

    が「すべて成功した場合」と「1つでも失敗した場合」にまとめてくれる!

    View full-size slide

  41. 4DBMBͰϞφυΛݟͯΈΔ
    41
    scala-hamsters/hamsters のMonad.scala

    View full-size slide

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

    View full-size slide

  43. 4DBMBͰϞφυΛݟͯΈΔ
    43
    scala-hamsters/hamsters のMonad.scala
    ⾃然変換
    f: A => Box[B]を渡せば、Box[A] => Box[B]という関数
    を にしてくれる感がある
    を に潰してもいる
    flatMap!

    View full-size slide

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

    View full-size slide