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

モナド則だけみつめていたい

 モナド則だけみつめていたい

LT駆動開発14の発表資料です。
https://github.com/LTDD/Sessions/wiki/LT%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA14

解説
http://blog.eiel.info/blog/2015/05/02/want-staring-monad-only-ltdd-14/

ゼノブレイドクロスが欲しいです。

Tomohiko Himura

May 03, 2015
Tweet

More Decks by Tomohiko Himura

Other Decks in Programming

Transcript

  1. Ϟφυଇ͚ͩΛݟͭΊ͍͍ͯͨ
    -5ۦಈ։ൃ

    View Slide

  2. ͻΉΒͱ΋ͻ͜
    Ϟφυͷ࿩Λ͠ΖͬͯݴΘΕͨ

    View Slide

  3. ݄ͷπΠʔτ
    https://twitter.com/eielh/status/587211824233230337

    View Slide

  4. ݄ͷπΠʔτ
    https://twitter.com/eielh/status/587211824233230337
    ͦ͏Ϟφυͩ

    View Slide

  5. Ϟφυ

    View Slide

  6. View Slide

  7. ਆ݋Ϟφυ

    View Slide

  8. ͕ͭʹͪൃചʜཉ͍͠ʜ

    View Slide

  9. վΊͯϞφυ

    View Slide

  10. ؔ਺ܕϓϩάϥϛϯάʹ͓͍ͯɺϞφυ(monad)͸ܭࢉΛදݱ͢Δ
    ߏ଄Ͱ͋Γɺܭࢉεςοϓͷྻ͔ΒͳΔɻͭ·Γɺܕ͕Ϟφυߏ଄
    Λ΋ͭͱ͍͏ͷ͸ɺ໋ྩΛܨ͛Δ΍Γํɺݴ͍׵͑ΔͱͦͷܕΛ΋
    ͭؔ਺Λωετͤ͞Δنଇ͕ఆ·͍ͬͯΔ͜ͱΛ͍͏ɻ͜Ε͸ϓϩ
    άϥϚ͕ύΠϓϥΠϯΛ࡞Δ͜ͱΛՄೳʹ͢ΔɻύΠϓϥΠϯͰ͸
    ೖྗσʔλΛ̍εςοϓͣͭॲཧ͢Δ͕ɺϞφυ͸֤ΞΫγϣϯʹ
    ௥ՃͷॲཧنଇΛ্৐ͤ͢Δ͜ͱ͕Ͱ͖Δɻ͜ͷ͜ͱ͔ΒɺϞφυ
    ͸ʮϓϩάϥϜՄೳͳηϛίϩϯʯͱهड़͢Δ͜ͱ΋Ͱ͖Δɻηϛ
    ίϩϯ͸ଟ͘ͷ໋ྩܕϓϩάϥϛϯάݴޠͰݸʑͷจΛܨ͙ԋࢉࢠ
    Ͱ͋Γɺ͜ͷྫ͑͸ɺύΠϓϥΠϯதͷจͷؒʹ௥ՃͰίʔυΛ࣮
    ߦͰ͖Δ͜ͱΛ͍ࣔࠦͯ͠Δɻ͞ΒʹϞφυ͸૊ΈཱͯϥΠϯͱ͍
    ͏ϝλϑΝʔͰઆ໌͢Δ͜ͱ΋Ͱ͖ΔɻϕϧτίϯϕΞ͕ػೳϢχο
    τͷؒͷσʔλసૹΛߦ͍ɺ֤Ϣχοτ͕Ұ౓ʹͻͱͭͣͭͦΕΛ
    ॲཧ͢ΔͷͰ͋Δɻଞʹ΋ɺδΣωϦοΫܕΛߏங͢ΔͨΊͷؔ਺
    ܕσβΠϯύλʔϯͱݟΔ͜ͱ΋Ͱ͖Δ

    View Slide

  11. ؔ਺ܕϓϩάϥϛϯάʹ͓͍ͯɺϞφυ(monad)͸ܭࢉΛදݱ͢Δ
    ߏ଄Ͱ͋Γɺܭࢉεςοϓͷྻ͔ΒͳΔɻͭ·Γɺܕ͕Ϟφυߏ଄
    Λ΋ͭͱ͍͏ͷ͸ɺ໋ྩΛܨ͛Δ΍Γํɺݴ͍׵͑ΔͱͦͷܕΛ΋
    ͭؔ਺Λωετͤ͞Δنଇ͕ఆ·͍ͬͯΔ͜ͱΛ͍͏ɻ͜Ε͸ϓϩ
    άϥϚ͕ύΠϓϥΠϯΛ࡞Δ͜ͱΛՄೳʹ͢ΔɻύΠϓϥΠϯͰ͸
    ೖྗσʔλΛ̍εςοϓͣͭॲཧ͢Δ͕ɺϞφυ͸֤ΞΫγϣϯʹ
    ௥ՃͷॲཧنଇΛ্৐ͤ͢Δ͜ͱ͕Ͱ͖Δɻ͜ͷ͜ͱ͔ΒɺϞφυ
    ͸ʮϓϩάϥϜՄೳͳηϛίϩϯʯͱهड़͢Δ͜ͱ΋Ͱ͖Δɻηϛ
    ίϩϯ͸ଟ͘ͷ໋ྩܕϓϩάϥϛϯάݴޠͰݸʑͷจΛܨ͙ԋࢉࢠ
    Ͱ͋Γɺ͜ͷྫ͑͸ɺύΠϓϥΠϯதͷจͷؒʹ௥ՃͰίʔυΛ࣮
    ߦͰ͖Δ͜ͱΛ͍ࣔࠦͯ͠Δɻ͞ΒʹϞφυ͸૊ΈཱͯϥΠϯͱ͍
    ͏ϝλϑΝʔͰઆ໌͢Δ͜ͱ΋Ͱ͖ΔɻϕϧτίϯϕΞ͕ػೳϢχο
    τͷؒͷσʔλసૹΛߦ͍ɺ֤Ϣχοτ͕Ұ౓ʹͻͱͭͣͭͦΕΛ
    ॲཧ͢ΔͷͰ͋Δɻଞʹ΋ɺδΣωϦοΫܕΛߏங͢ΔͨΊͷؔ਺
    ܕσβΠϯύλʔϯͱݟΔ͜ͱ΋Ͱ͖Δ
    Α͘Θ͔Βͳ͍

    View Slide

  12. ܅͚ͩΛΈͭΊ͍͍ͯͨ

    View Slide

  13. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  14. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO
    ͏͍ͭ͘͠

    View Slide

  15. ͱ͏͡ΐ͏͡ΜͿͭ
    SFUVSO
    KPJO
    GNBQ

    View Slide

  16. return x
    YΛശʹೖΕΔ
    Y

    View Slide

  17. return x
    YΛശʹೖΕΔ
    Y

    View Slide

  18. return 1 :: [] Int
    [1] ཁૉ͕ͻͱͭͷϦετ

    View Slide

  19. return (return 1) :: [] [] Int
    [[1]] ϦετͷϦετ

    View Slide

  20. join [[x]]
    ೋͭҎ্ͷശʹ͸͍͍ͬͯΔ࣌
    ֎ͷശΛফͤΔ
    Y

    View Slide

  21. join [[x]]
    ೋͭҎ্ͷശʹ͸͍͍ͬͯΔ࣌
    ֎ͷശΛফͤΔ
    Y

    View Slide

  22. join [[x]]
    ೋͭҎ্ͷശʹ͸͍͍ͬͯΔ࣌
    ֎ͷശΛফͤΔ
    Y

    View Slide

  23. join [[x]]
    ೋͭҎ্ͷശʹ͸͍͍ͬͯΔ࣌
    ֎ͷശΛফͤΔ
    Y
    ֎ͷശʹ͋ͬͨ৘ใ͸
    ಺ͷശʹ٧ΊͨΓ
    ͳ͘ͳͬͨΓ

    View Slide

  24. join [[1]] :: [] Int
    [1] ཁૉ͕ͻͱͭͷϦετ

    View Slide

  25. join [[[1]]] :: [] [] Int
    [[1]] ϦετͷϦετ

    View Slide

  26. ശ͔Βத਎Λग़ͤͳ͍

    View Slide

  27. [1] -> 1 ʹ͸Ͱ͖ͳ͍

    View Slide

  28. ͳ͔ͥ
    ཁૉ͕ෳ਺͋Δ৔߹Λߟ͑Δ
    [[1,2,3]] -> [1,2,3]
    [[1],[2],[3]] -> [1,2,3]

    View Slide

  29. ͳ͔ͥ
    ཁૉ͕ෳ਺͋Δ৔߹Λߟ͑Δ
    [[1,2,3]] -> [1,2,3]
    [[1],[2],[3]] -> [1,2,3]
    ͳΜͱ͔ͳΔ

    View Slide

  30. [1,2,3] -> 1, 2, 3

    View Slide

  31. [1,2,3] -> 1, 2, 3
    ͳΜͱ͔ͳΒͳ͍ʂʂ

    View Slide

  32. ശΛݮΒ͢ͱ͖ͷϧʔϧ͕͋Δ

    View Slide

  33. ശΛݮΒ͢ͱ͖ͷϧʔϧ͕͋Δ
    ͻͱͭശ͕͋Ε͹٧ΊࠐΊΔ

    View Slide

  34. fmap f
    த਎ʹରͯ͠࢖͑ΔػೳΛ
    ശʹೖΕͯ΋࢖͑ΔΑ͏ʹ͢Δ
    Y Z
    G
    Y Z
    GNBQG

    View Slide

  35. add3 = (3+)
    add3 1 -> 4
    (fmap add3) [1] -> [4]

    View Slide

  36. add3 = (3+)
    (fmap (fmap add3)) [[1]] -> [[4]]

    View Slide

  37. add3 = (3+)
    (fmap add3) [1,2,3] -> [4,5,6]

    View Slide

  38. add3 = (3+)
    (fmap add3) [1,2,3] -> [4,5,6]
    ശʹ߹ΘͤͯਐԽ͢Δ

    View Slide

  39. Ϟφυ͋ΔͨΊʹ͸
    ϞφυଇΛकΔඞཁ͕͋Δ

    View Slide

  40. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  41. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  42. KPJOGNBQKPJO
    KPJOKPJO
    Y
    Y Y Y
    Y Y

    View Slide

  43. KPJOGNBQKPJO
    KPJOKPJO
    Y
    Y Y Y
    Y Y
    ֎͔Β֎ͯ͠΋ɺ಺͔Β֎ͯ͠΋
    ಉ͡ʹͳΔ͜ͱ

    View Slide

  44. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  45. KPJOGNBQSFUVSO
    KPJOSFUVSO
    Y
    Y
    Y Y
    Y Y

    View Slide

  46. KPJOGNBQSFUVSO
    KPJOSFUVSO
    Y
    Y
    Y Y
    Y Y
    ಺ଆ͔Βശʹ͍Εͯ΋
    ֎ଆ͔Βശʹ͍Εͯ΋
    ശΛͳͤ͘͹ಉ͡ʹͳΔ͜ͱ

    View Slide

  47. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  48. SFUVSOG
    GNBQGSFUVSO
    Y
    Y
    Z Z
    Y Z

    View Slide

  49. SFUVSOG
    GNBQGSFUVSO
    Y
    Y
    Z Z
    Y Z
    த਎Λม͑ͯശʹ͍ΕΔ
    ശʹ͍Ε͔ͯΒத਎Λม͑Δ
    Ͳͬͪ΋ಉ͡ʹͳΔ͜ͱ

    View Slide

  50. Ϟφυଇ
    KPJOGNBQKPJOKPJOKPJO
    KPJOGNBQSFUVSOKPJOSFUVSOJE
    SFUVSOGGNBQGSFUVSO
    KPJOGNBQ GNBQG
    GNBQGKPJO

    View Slide

  51. KPJOGNBQ GNBQG

    GNBQGKPJO
    Y Z
    Y Z
    Y Y
    Z
    Y
    Y

    View Slide

  52. KPJOGNBQ GNBQG

    GNBQGKPJO
    Y Z
    Y Z
    Y Y
    Z
    Y
    Y
    த਎Λม͔͑ͯΒശ͔Βग़ͯ͠΋
    ശ͔Βग़ͯ͠த਎Λม͑ͯ΋
    Ͳͬͪ΋ಉ͡ʹͳΔ͜ͱ

    View Slide

  53. ശ͔Βத਎Λग़͞ͳ͖ΌOK

    View Slide


  54. SFUVSOͰ࡞ΕΔശ

    View Slide


  55. SFUVSOͰ࡞ΕΔശ
    SFUVSOҙ֎Ͱശ͕ͭ͘ΕΔ৔߹͕͋Δ

    View Slide


  56. SFUVSOͰ࡞ΕΔശ
    >>>
    > ><>

    View Slide


  57. SFUVSOͰ࡞ΕΔശ
    >>>
    > ><>
    Ϧετͷ৔߹

    View Slide

  58. ശʹೖΕͭͭԿ͔͢Δ

    View Slide

  59. ശʹೖΕͭͭԿ͔͢Δ
    Y Z

    View Slide

  60. ശʹೖͬͯͨΒʁ
    Y Z
    GNBQ

    View Slide

  61. ૊Έ߹ΘͤͨΒ…
    Z [
    GNBQ
    Y

    View Slide

  62. join…
    Z [
    GNBQ
    Y

    View Slide

  63. Λ͔ͭͬͯܨ͛Δ…
    Z [
    GNBQ
    B
    GNBQ
    KPJO KPJO

    View Slide

  64. fmap join ͷ܁Γฦ͠

    View Slide

  65. x >>= f join (fmap f x)

    View Slide

  66. ΈͳΕ͍ͯΔϞφυଇ
    SFUVSOYGGY
    NSFUVSON
    NG
    HN aYGYH

    View Slide

  67. ശͷத
    SFUVSOͰ͸ೖΕΒΕͳ͍
    Կ͔͕ೖ͍ͬͯΔ

    View Slide

  68. ശͷத
    ശ͕ͻͱͭͰ΋͋Ε͹
    ·ͱΊΒΕΔ

    View Slide

  69. Ϧετ
    ཁૉ͕ͨ͘͞Μ͸͍ͬͯΔ

    View Slide

  70. Maybe
    Կ΋͸͍ͬͯͳ͍ശ͕͋Δ

    View Slide

  71. IO
    ੈքͱର࿩͢Δ৔ॴ͕͸͍ͬͯΔ
    ശ͔Βத਎ΛऔΓग़͢ͷʹੈք͕ඞཁ

    View Slide

  72. Ϟφυ೉͍͠

    View Slide

  73. ·ͱΊ

    View Slide

  74. ·ͱΊ
    ശͷதʹശΛೖΕΒΕΔ
    ശͷதʹೖ͍ͬͯΔശ͸औΓग़ͤΔ
    ͨͩ͠ɺശͷதʹԡ͠ࠐΉ
    ശͷத͔Βத਎͸ग़ͤͳ͍
    ग़ͤͳ͍த਎ΛফԽ͢Ε͹ग़ͤͳ͘͸ͳ͍
    ശʹೖΕͳ͕ΒԿ͔͢ΔͷΛ૊Έ߹ΘͤΒΕΔ

    View Slide

  75. ֮͑ํ
    ϦετϦετϦετϦετ͸ϦετʹͰ͖Δ
    ϝλϝλϝλϓϩάϥϛϯά͸ϝλϓϩάϥ
    ϛϯάͩ

    View Slide

  76. ࢀߟจݙ
    Wikibooks Haskell/ݍ࿦


    http://ja.wikibooks.org/wiki/Haskell/%E5%9C%8F
    %E8%AB
    %96#.E3.83.A2.E3.83.8A.E3.83.89.E5.89.87.E3.81.A
    8.E3.81.9D.E3.81.AE.E9.87.8D.E8.A6.81.E6.80.A7

    View Slide