23
Monadなんてどうってことなかった話 山本悠滋 20150321 モナド基礎勉強会

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

  • Upload
    -

  • View
    635

  • Download
    1

Embed Size (px)

Citation preview

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

Monadなんてどうってことなかった話

山本悠滋

20150321 モナド基礎勉強会

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

こんにちは!山本悠滋(@igrep) 25歳♂

Haskellの勉強会を毎月やっとります。

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

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

予めことわるとここでのMonadはプログラミングで使うMonadだった

特にHaskellのMonadが中心だった

※あくまでもMonadを「使う」ことしかしないただのプログラマからの主張である点をご容赦ください。 vim(_ _)mer

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

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

こういう定義の型クラスだった

class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b

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

ただの型クラスだけど違った

なんか変な使い方ができる

hoge uID = do fname <- lookup uID firstNameDB lname <- lookup uID lastNameDB return $ fname ++ lname

だったり、

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

ただの型クラスだけど違った

こんなん

foo = do tell ["hello, "] tell ["world!"]

だったり、

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

ただの型クラスだけど違った

こんなんだったり...。

main = do putStr "こんなんだったり" replicateM_ 3 $ do threadDelay 1000000 putStr "." putStrLn "。"

何がどうなってんの!?

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

間でなんかしてるだけだった

 の場合、

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

間でなんかしてるだけだった

 のところでなんかしてるだけだった。

具体的にはJustかNothingか判定してるだけだった。

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

間でなんかしてるだけだった

 の場合、

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

間でなんかしてるだけだった

 のところで(tellを実行するたびに)なんかしてるだけだった。

具体的には引数に与えたものをログとして追記してるだけだった。

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

desugarしたらもっと簡単だったlookup uID firstNameDB >>= (\fname -> ...)

>>= がなんかしてる!

やっぱりJustかNothingか判定してる!

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

ほかも大体一緒だったList: 要素を1個ずつ取り出してる!

State: 関数が返した新しい状態で更新してる!

Parser: 与えられた文字列を消費してる!

IO: なんかいろいろやってる!

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

ほかも大体一緒だったなんやかんやで大事なことはだいたい>>=の中でやってる!

だからMonadはMonadとしてひとくくりにできる!!

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

同じなのは例のモナド則。

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

例のモナド則「実質何もしない」処理(return)があること

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

例のモナド則

do記法で

do a <- do b <- foo bar b baz a

みたいに書いたり、

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

例のモナド則

do記法で

do b <- foo do a <- bar b baz a

みたいに結合の仕方に気を使わなくてよくなっていること

(この例と前のスライドの例が必ず同じ意味になること)

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

違うのは>>=でやってること。

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

>>=でやってること「例のモナド則」を満たせば何だっていい

およそ「手続き」っぽいものであればなんでもいい。

Stateも、IOも、あるんだよ

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

>>=でやってること何もしてなくたっていい(Identity Monad)

仕事してなくってもいい(ニート Monad)

複数のMonadがやってることを寄せ集めても(大抵)いい

Monad Transformer

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

何だったんだ...「何でもいい」から難しい。

なんだかいろいろできるのでまとまらない(ように見える)

そのクセdo記法なんて用意して特別扱い。

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

まとめHaskellのMonadはあくまでも型クラスだった

大事なことはだいたい>>=でやってた

やってることはみんな違った

みんなちがって、みんないい。

ニートでもいい。

何でもできるからよくわからなくなっていた