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