Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Monadなんてどうってことなかった話
山本悠滋
2015­03­21 モナド基礎勉強会
こんにちは!
山本悠滋(@igrep) 25歳♂
Haskellの勉強会を毎月やっとります。
Monadなんてどうってことなかった
ただの型クラスだった
予めことわるとここでのMonadはプログラミングで使う
Monadだった
特にHaskellのMonadが中心だった
※あくまでもMonadを「使う」ことしかしないただのプログ
ラマか...
Monadなんてどうってことなかった
ただの型クラスだった
こういう定義の型クラスだった
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
ただの型クラスだけど違った
なんか変な使い方ができる
hoge uID = do
fname <- lookup uID firstNameDB
lname <- lookup uID lastNameDB
return $ fname ++ ...
ただの型クラスだけど違った
こんなん
foo = do
tell ["hello, "]
tell ["world!"]
だったり、
ただの型クラスだけど違った
こんなんだったり...。
main = do
putStr "こんなんだったり"
replicateM_ 3 $ do
threadDelay 1000000
putStr "."
putStrLn "。"
何がどう...
間でなんかしてるだけだった
 の場合、
間でなんかしてるだけだった
 のところでなんかしてるだけだった。
具体的にはJustかNothingか判定してるだけだった。
間でなんかしてるだけだった
 の場合、
間でなんかしてるだけだった
 のところで(tellを実行するたびに)なんかしてるだ
けだった。
具体的には引数に与えたものをログとして追記して
るだけだった。
desugarしたらもっと簡単だった
lookup uID firstNameDB >>= (fname -> ...)
>>= がなんかしてる!
やっぱりJustかNothingか判定してる!
ほかも大体一緒だった
List: 要素を1個ずつ取り出してる!
State: 関数が返した新しい状態で更新してる!
Parser: 与えられた文字列を消費してる!
IO: なんかいろいろやってる!
ほかも大体一緒だった
なんやかんやで大事なことはだいたい>>=の中でやって
る!
だからMonadはMonadとしてひとくくりにできる!!
同じなのは
例のモナド則。
例のモナド則
「実質何もしない」処理(return)があること
例のモナド則
do記法で
do
a <- do
b <- foo
bar b
baz a
みたいに書いたり、
例のモナド則
do記法で
do
b <- foo
do
a <- bar b
baz a
みたいに結合の仕方に気を使わなくてよくなっていること
(この例と前のスライドの例が必ず同じ意味になること)
違うのは
>>=でやってること。
>>=でやってること
「例のモナド則」を満たせば何だっていい
およそ「手続き」っぽいものであればなんでもいい。
Stateも、IOも、あるんだよ
>>=でやってること
何もしてなくたっていい(Identity Monad)
仕事してなくってもいい(ニート Monad)
複数のMonadがやってることを寄せ集めても(大抵)いい
Monad Transformer
何だったんだ...
「何でもいい」から難しい。
なんだかいろいろできるのでまとまらない(ように見える)
そのクセdo記法なんて用意して特別扱い。
まとめ
HaskellのMonadはあくまでも型クラスだった
大事なことはだいたい>>=でやってた
やってることはみんな違った
みんなちがって、みんないい。
ニートでもいい。
何でもできるからよくわからなくなっていた
Upcoming SlideShare
Loading in …5
×

Monadなんてどうってことなかった話 - Monadなんてただの型クラス!

1,534 views

Published on

私が理解したHaskellのMonadについてお話します。
Monad自体は至って単純で、なんでもできます。なんでもできるから難しいのです。
Monadはみんな機能が(一見して)バラバラですが、大事なことはだいたい>>=(bind関数)がやっています。
みんなそれぞれ>>=が違うだけなんです。

Published in: Software

Monadなんてどうってことなかった話 - Monadなんてただの型クラス!

  1. 1. Monadなんてどうってことなかった話 山本悠滋 2015­03­21 モナド基礎勉強会
  2. 2. こんにちは! 山本悠滋(@igrep) 25歳♂ Haskellの勉強会を毎月やっとります。
  3. 3. Monadなんてどうってことなかった ただの型クラスだった 予めことわるとここでのMonadはプログラミングで使う Monadだった 特にHaskellのMonadが中心だった ※あくまでもMonadを「使う」ことしかしないただのプログ ラマからの主張である点をご容赦ください。 vim(_ _)mer
  4. 4. Monadなんてどうってことなかった ただの型クラスだった こういう定義の型クラスだった class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b
  5. 5. ただの型クラスだけど違った なんか変な使い方ができる hoge uID = do fname <- lookup uID firstNameDB lname <- lookup uID lastNameDB return $ fname ++ lname だったり、
  6. 6. ただの型クラスだけど違った こんなん foo = do tell ["hello, "] tell ["world!"] だったり、
  7. 7. ただの型クラスだけど違った こんなんだったり...。 main = do putStr "こんなんだったり" replicateM_ 3 $ do threadDelay 1000000 putStr "." putStrLn "。" 何がどうなってんの!?
  8. 8. 間でなんかしてるだけだった  の場合、
  9. 9. 間でなんかしてるだけだった  のところでなんかしてるだけだった。 具体的にはJustかNothingか判定してるだけだった。
  10. 10. 間でなんかしてるだけだった  の場合、
  11. 11. 間でなんかしてるだけだった  のところで(tellを実行するたびに)なんかしてるだ けだった。 具体的には引数に与えたものをログとして追記して るだけだった。
  12. 12. desugarしたらもっと簡単だった lookup uID firstNameDB >>= (fname -> ...) >>= がなんかしてる! やっぱりJustかNothingか判定してる!
  13. 13. ほかも大体一緒だった List: 要素を1個ずつ取り出してる! State: 関数が返した新しい状態で更新してる! Parser: 与えられた文字列を消費してる! IO: なんかいろいろやってる!
  14. 14. ほかも大体一緒だった なんやかんやで大事なことはだいたい>>=の中でやって る! だからMonadはMonadとしてひとくくりにできる!!
  15. 15. 同じなのは 例のモナド則。
  16. 16. 例のモナド則 「実質何もしない」処理(return)があること
  17. 17. 例のモナド則 do記法で do a <- do b <- foo bar b baz a みたいに書いたり、
  18. 18. 例のモナド則 do記法で do b <- foo do a <- bar b baz a みたいに結合の仕方に気を使わなくてよくなっていること (この例と前のスライドの例が必ず同じ意味になること)
  19. 19. 違うのは >>=でやってること。
  20. 20. >>=でやってること 「例のモナド則」を満たせば何だっていい およそ「手続き」っぽいものであればなんでもいい。 Stateも、IOも、あるんだよ
  21. 21. >>=でやってること 何もしてなくたっていい(Identity Monad) 仕事してなくってもいい(ニート Monad) 複数のMonadがやってることを寄せ集めても(大抵)いい Monad Transformer
  22. 22. 何だったんだ... 「何でもいい」から難しい。 なんだかいろいろできるのでまとまらない(ように見える) そのクセdo記法なんて用意して特別扱い。
  23. 23. まとめ HaskellのMonadはあくまでも型クラスだった 大事なことはだいたい>>=でやってた やってることはみんな違った みんなちがって、みんないい。 ニートでもいい。 何でもできるからよくわからなくなっていた

×