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/
ゼノブレイドクロスが欲しいです。
Ϟφυଇ͚ͩΛݟͭΊ͍͍ͯͨ-5ۦಈ։ൃ
View Slide
ͻΉΒͱͻ͜ϞφυͷΛ͠ΖͬͯݴΘΕͨ
݄ͷπΠʔτhttps://twitter.com/eielh/status/587211824233230337
݄ͷπΠʔτhttps://twitter.com/eielh/status/587211824233230337ͦ͏Ϟφυͩ
Ϟφυ
ਆϞφυ
͕ͭʹͪൃചʜཉ͍͠ʜ
վΊͯϞφυ
ؔܕϓϩάϥϛϯάʹ͓͍ͯɺϞφυ(monad)ܭࢉΛදݱ͢ΔߏͰ͋Γɺܭࢉεςοϓͷྻ͔ΒͳΔɻͭ·Γɺܕ͕ϞφυߏΛͭͱ͍͏ͷɺ໋ྩΛܨ͛ΔΓํɺݴ͍͑ΔͱͦͷܕΛͭؔΛωετͤ͞Δنଇ͕ఆ·͍ͬͯΔ͜ͱΛ͍͏ɻ͜ΕϓϩάϥϚ͕ύΠϓϥΠϯΛ࡞Δ͜ͱΛՄೳʹ͢ΔɻύΠϓϥΠϯͰೖྗσʔλΛ̍εςοϓͣͭॲཧ͢Δ͕ɺϞφυ֤ΞΫγϣϯʹՃͷॲཧنଇΛ্ͤ͢Δ͜ͱ͕Ͱ͖Δɻ͜ͷ͜ͱ͔ΒɺϞφυʮϓϩάϥϜՄೳͳηϛίϩϯʯͱهड़͢Δ͜ͱͰ͖Δɻηϛίϩϯଟ͘ͷ໋ྩܕϓϩάϥϛϯάݴޠͰݸʑͷจΛܨ͙ԋࢉࢠͰ͋Γɺ͜ͷྫ͑ɺύΠϓϥΠϯதͷจͷؒʹՃͰίʔυΛ࣮ߦͰ͖Δ͜ͱΛ͍ࣔࠦͯ͠Δɻ͞ΒʹϞφυΈཱͯϥΠϯͱ͍͏ϝλϑΝʔͰઆ໌͢Δ͜ͱͰ͖ΔɻϕϧτίϯϕΞ͕ػೳϢχοτͷؒͷσʔλసૹΛߦ͍ɺ֤Ϣχοτ͕ҰʹͻͱͭͣͭͦΕΛॲཧ͢ΔͷͰ͋ΔɻଞʹɺδΣωϦοΫܕΛߏங͢ΔͨΊͷؔܕσβΠϯύλʔϯͱݟΔ͜ͱͰ͖Δ
ؔܕϓϩάϥϛϯάʹ͓͍ͯɺϞφυ(monad)ܭࢉΛදݱ͢ΔߏͰ͋Γɺܭࢉεςοϓͷྻ͔ΒͳΔɻͭ·Γɺܕ͕ϞφυߏΛͭͱ͍͏ͷɺ໋ྩΛܨ͛ΔΓํɺݴ͍͑ΔͱͦͷܕΛͭؔΛωετͤ͞Δنଇ͕ఆ·͍ͬͯΔ͜ͱΛ͍͏ɻ͜ΕϓϩάϥϚ͕ύΠϓϥΠϯΛ࡞Δ͜ͱΛՄೳʹ͢ΔɻύΠϓϥΠϯͰೖྗσʔλΛ̍εςοϓͣͭॲཧ͢Δ͕ɺϞφυ֤ΞΫγϣϯʹՃͷॲཧنଇΛ্ͤ͢Δ͜ͱ͕Ͱ͖Δɻ͜ͷ͜ͱ͔ΒɺϞφυʮϓϩάϥϜՄೳͳηϛίϩϯʯͱهड़͢Δ͜ͱͰ͖Δɻηϛίϩϯଟ͘ͷ໋ྩܕϓϩάϥϛϯάݴޠͰݸʑͷจΛܨ͙ԋࢉࢠͰ͋Γɺ͜ͷྫ͑ɺύΠϓϥΠϯதͷจͷؒʹՃͰίʔυΛ࣮ߦͰ͖Δ͜ͱΛ͍ࣔࠦͯ͠Δɻ͞ΒʹϞφυΈཱͯϥΠϯͱ͍͏ϝλϑΝʔͰઆ໌͢Δ͜ͱͰ͖ΔɻϕϧτίϯϕΞ͕ػೳϢχοτͷؒͷσʔλసૹΛߦ͍ɺ֤Ϣχοτ͕ҰʹͻͱͭͣͭͦΕΛॲཧ͢ΔͷͰ͋ΔɻଞʹɺδΣωϦοΫܕΛߏங͢ΔͨΊͷؔܕσβΠϯύλʔϯͱݟΔ͜ͱͰ͖ΔΑ͘Θ͔Βͳ͍
܅͚ͩΛΈͭΊ͍͍ͯͨ
ϞφυଇKPJOGNBQKPJOKPJOKPJOKPJOGNBQSFUVSOKPJOSFUVSOJESFUVSOGGNBQGSFUVSOKPJOGNBQ GNBQGGNBQGKPJO
ϞφυଇKPJOGNBQKPJOKPJOKPJOKPJOGNBQSFUVSOKPJOSFUVSOJESFUVSOGGNBQGSFUVSOKPJOGNBQ GNBQGGNBQGKPJO͏͍ͭ͘͠
ͱ͏͡ΐ͏͡ΜͿͭSFUVSOKPJOGNBQ
return xYΛശʹೖΕΔY
return 1 :: [] Int[1] ཁૉ͕ͻͱͭͷϦετ
return (return 1) :: [] [] Int[[1]] ϦετͷϦετ
join [[x]]ೋͭҎ্ͷശʹ͍͍ͬͯΔ࣌֎ͷശΛফͤΔY
join [[x]]ೋͭҎ্ͷശʹ͍͍ͬͯΔ࣌֎ͷശΛফͤΔY֎ͷശʹ͋ͬͨใͷശʹ٧ΊͨΓͳ͘ͳͬͨΓ
join [[1]] :: [] Int[1] ཁૉ͕ͻͱͭͷϦετ
join [[[1]]] :: [] [] Int[[1]] ϦετͷϦετ
ശ͔ΒதΛग़ͤͳ͍
[1] -> 1 ʹͰ͖ͳ͍
ͳ͔ͥཁૉ͕ෳ͋Δ߹Λߟ͑Δ[[1,2,3]] -> [1,2,3][[1],[2],[3]] -> [1,2,3]
ͳ͔ͥཁૉ͕ෳ͋Δ߹Λߟ͑Δ[[1,2,3]] -> [1,2,3][[1],[2],[3]] -> [1,2,3]ͳΜͱ͔ͳΔ
[1,2,3] -> 1, 2, 3
[1,2,3] -> 1, 2, 3ͳΜͱ͔ͳΒͳ͍ʂʂ
ശΛݮΒ͢ͱ͖ͷϧʔϧ͕͋Δ
ശΛݮΒ͢ͱ͖ͷϧʔϧ͕͋Δͻͱͭശ͕͋Ε٧ΊࠐΊΔ
fmap fதʹରͯ͑͠ΔػೳΛശʹೖΕͯ͑ΔΑ͏ʹ͢ΔY ZGY ZGNBQG
add3 = (3+)add3 1 -> 4(fmap add3) [1] -> [4]
add3 = (3+)(fmap (fmap add3)) [[1]] -> [[4]]
add3 = (3+)(fmap add3) [1,2,3] -> [4,5,6]
add3 = (3+)(fmap add3) [1,2,3] -> [4,5,6]ശʹ߹ΘͤͯਐԽ͢Δ
Ϟφυ͋ΔͨΊʹϞφυଇΛकΔඞཁ͕͋Δ
KPJOGNBQKPJOKPJOKPJOYY Y YY Y
KPJOGNBQKPJOKPJOKPJOYY Y YY Y֎͔Β֎ͯ͠ɺ͔Β֎ͯ͠ಉ͡ʹͳΔ͜ͱ
KPJOGNBQSFUVSOKPJOSFUVSOYYY YY Y
KPJOGNBQSFUVSOKPJOSFUVSOYYY YY Yଆ͔Βശʹ͍Εͯ֎ଆ͔Βശʹ͍ΕͯശΛͳͤ͘ಉ͡ʹͳΔ͜ͱ
SFUVSOGGNBQGSFUVSOYYZ ZY Z
SFUVSOGGNBQGSFUVSOYYZ ZY ZதΛม͑ͯശʹ͍ΕΔശʹ͍Ε͔ͯΒதΛม͑ΔͲͬͪಉ͡ʹͳΔ͜ͱ
KPJOGNBQ GNBQGGNBQGKPJOY ZY ZY YZYY
KPJOGNBQ GNBQGGNBQGKPJOY ZY ZY YZYYதΛม͔͑ͯΒശ͔Βग़ͯ͠ശ͔Βग़ͯ͠தΛม͑ͯͲͬͪಉ͡ʹͳΔ͜ͱ
ശ͔ΒதΛग़͞ͳ͖ΌOK
ശSFUVSOͰ࡞ΕΔശ
ശSFUVSOͰ࡞ΕΔശSFUVSOҙ֎Ͱശ͕ͭ͘ΕΔ߹͕͋Δ
ശSFUVSOͰ࡞ΕΔശ>>> > ><>
ശSFUVSOͰ࡞ΕΔശ>>> > ><>Ϧετͷ߹
ശʹೖΕͭͭԿ͔͢Δ
ശʹೖΕͭͭԿ͔͢ΔY Z
ശʹೖͬͯͨΒʁY ZGNBQ
Έ߹ΘͤͨΒ…Z [GNBQY
join…Z [GNBQY
Λ͔ͭͬͯܨ͛Δ…Z [GNBQBGNBQKPJO KPJO
fmap join ͷ܁Γฦ͠
x >>= f join (fmap f x)
ΈͳΕ͍ͯΔϞφυଇ SFUVSOYGGY NSFUVSON NGHN aYGYH
ശͷதSFUVSOͰೖΕΒΕͳ͍Կ͔͕ೖ͍ͬͯΔ
ശͷதശ͕ͻͱͭͰ͋Ε·ͱΊΒΕΔ
Ϧετཁૉ͕ͨ͘͞Μ͍ͬͯΔ
MaybeԿ͍ͬͯͳ͍ശ͕͋Δ
IOੈքͱର͢Δॴ͕͍ͬͯΔശ͔ΒதΛऔΓग़͢ͷʹੈք͕ඞཁ
Ϟφυ͍͠
·ͱΊ
·ͱΊശͷதʹശΛೖΕΒΕΔശͷதʹೖ͍ͬͯΔശऔΓग़ͤΔͨͩ͠ɺശͷதʹԡ͠ࠐΉശͷத͔Βதग़ͤͳ͍ग़ͤͳ͍தΛফԽ͢Εग़ͤͳ͘ͳ͍ശʹೖΕͳ͕ΒԿ͔͢ΔͷΛΈ߹ΘͤΒΕΔ
֮͑ํϦετϦετϦετϦετϦετʹͰ͖Δϝλϝλϝλϓϩάϥϛϯάϝλϓϩάϥϛϯάͩ
ࢀߟจݙ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.A8.E3.81.9D.E3.81.AE.E9.87.8D.E8.A6.81.E6.80.A7