SlideShare une entreprise Scribd logo
1  sur  23
Télécharger pour lire hors ligne
Monadなんてどうってことなかった話
山本悠滋
2015­03­21 モナド基礎勉強会
こんにちは!
山本悠滋(@igrep) 25歳♂
Haskellの勉強会を毎月やっとります。
Monadなんてどうってことなかった
ただの型クラスだった
予めことわるとここでのMonadはプログラミングで使う
Monadだった
特にHaskellのMonadが中心だった
※あくまでもMonadを「使う」ことしかしないただのプログ
ラマからの主張である点をご容赦ください。 vim(_ _)mer
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 ++ lname
だったり、
ただの型クラスだけど違った
こんなん
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はあくまでも型クラスだった
大事なことはだいたい>>=でやってた
やってることはみんな違った
みんなちがって、みんないい。
ニートでもいい。
何でもできるからよくわからなくなっていた

Contenu connexe

En vedette

ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266Kiwamu Okabe
 
Metasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCUMetasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCUKiwamu Okabe
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS languageKiwamu Okabe
 
ATS language overview
ATS language overviewATS language overview
ATS language overviewKiwamu Okabe
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoKiwamu Okabe
 
Metasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCUMetasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCUKiwamu Okabe
 
Start! ATS programming
Start! ATS programmingStart! ATS programming
Start! ATS programmingKiwamu Okabe
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming TutorialKiwamu Okabe
 
Real-time OS system state captured by ATS language
Real-time OS system state captured by ATS languageReal-time OS system state captured by ATS language
Real-time OS system state captured by ATS languageKiwamu Okabe
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUKiwamu Okabe
 
ATS language overview'
ATS language overview'ATS language overview'
ATS language overview'Kiwamu Okabe
 
Static typing and proof in ATS language
Static typing and proof in ATS languageStatic typing and proof in ATS language
Static typing and proof in ATS languageKiwamu Okabe
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方k maztani
 

En vedette (13)

ATS programming on ESP8266
ATS programming on ESP8266ATS programming on ESP8266
ATS programming on ESP8266
 
Metasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCUMetasepi team meeting #14: ATS programming on MCU
Metasepi team meeting #14: ATS programming on MCU
 
Embedded application designed by ATS language
Embedded application designed by ATS languageEmbedded application designed by ATS language
Embedded application designed by ATS language
 
ATS language overview
ATS language overviewATS language overview
ATS language overview
 
Metasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on ArduinoMetasepi team meeting #19: ATS application on Arduino
Metasepi team meeting #19: ATS application on Arduino
 
Metasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCUMetasepi team meeting #16: Safety on ATS language + MCU
Metasepi team meeting #16: Safety on ATS language + MCU
 
Start! ATS programming
Start! ATS programmingStart! ATS programming
Start! ATS programming
 
ATS Programming Tutorial
ATS Programming TutorialATS Programming Tutorial
ATS Programming Tutorial
 
Real-time OS system state captured by ATS language
Real-time OS system state captured by ATS languageReal-time OS system state captured by ATS language
Real-time OS system state captured by ATS language
 
Metasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCUMetasepi team meeting #20: Start! ATS programming on MCU
Metasepi team meeting #20: Start! ATS programming on MCU
 
ATS language overview'
ATS language overview'ATS language overview'
ATS language overview'
 
Static typing and proof in ATS language
Static typing and proof in ATS languageStatic typing and proof in ATS language
Static typing and proof in ATS language
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方
 

Plus de 悠滋 山本

Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】悠滋 山本
 
Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)悠滋 山本
 
Whom to Recommend Elm to?
Whom to Recommend Elm to?Whom to Recommend Elm to?
Whom to Recommend Elm to?悠滋 山本
 
いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談悠滋 山本
 
Predefを使ったsqlのトレース
Predefを使ったsqlのトレースPredefを使ったsqlのトレース
Predefを使ったsqlのトレース悠滋 山本
 
Monad as things to do
Monad as things to doMonad as things to do
Monad as things to do悠滋 山本
 

Plus de 悠滋 山本 (6)

Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
Haskell-jpらしさって︖ 「⽬的」と「活動」のすべてを解説︕ 【プログラミング⾔語コミュニティーとしての Haskell-jp】
 
Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)Introduction to stack's docker integration (1)
Introduction to stack's docker integration (1)
 
Whom to Recommend Elm to?
Whom to Recommend Elm to?Whom to Recommend Elm to?
Whom to Recommend Elm to?
 
いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談いつもどおりのテンションでしゃべるEightの怪談
いつもどおりのテンションでしゃべるEightの怪談
 
Predefを使ったsqlのトレース
Predefを使ったsqlのトレースPredefを使ったsqlのトレース
Predefを使ったsqlのトレース
 
Monad as things to do
Monad as things to doMonad as things to do
Monad as things to do
 

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