More Related Content Similar to Monad tutorial Similar to Monad tutorial (20) More from Hideyuki Tanaka More from Hideyuki Tanaka (7) Monad tutorial1. 函数プログラミングの集い2011
チュートリゕル
「モナドについて」
株式会社 Preffered Infrastructure
田中 英行
tanaka.hideyuki@gmail.com
2. 自己紹介
• 田中英行 (@tanakh, id:tanakh)
• 株式会社 Preferred Infrastructure (PFI) 勤務
– 検索エンジンのゕルゴリズムとか作ってます
• Haskell (2004~)
• C++ (1998~)
• BASIC (1992~)
• プログラミングコンテスト愛好家
– ICPC, ICFPC, CodeJam, TopCoder, …
16. モナドとは手続き型パラダムの
再定義である
• プログラミングパラダム
– 手続き型
• モナデゖック
– 関数型
– 論理型
– オブジェクト志向
17. 意味的側面からの
モナドのメタフゔー
• モナドは『プログラマブルセミコロン』
である
23. セミコロンをいじることにより
可能になること
• 普通のプログラムを非決定計算に変える
• 普通のプログラムにエラーハンドリング
を(プログラムを書き換えずに)追加する
• 普通のプログラムに暗黙の状態を導入す
る
24. コンテクスト
• 具体的なモナドに対して、それが計算に
付加価値を与えます。それを(計算の)
コンテクストと呼ぶことにします
– つまり、モナドというのはコンテクスト付き
の計算ということができる
• 例えば…
– monad:リストモナド → ctx:非決定性
– monad:Stateモナド → ctx:mutableな状態
– etc …
29. 例
• N-クーン問題
– Int が与えられて解を返す
– 解とはなんぞや?
• 全解列挙
• どれか一つを見つける
• 一番いい解を頼む
– いろいろ考えうる
31. 前半まとめ
• モナドとは何なのか?
– 計算コンテクストの抽象化である
• なんでそれが嬉しいの?
– 具体的なコンテクストに依存しないコードを
書ける
– 抽象化したものを具体的なコードにできる
• なぜモナドなの?
– モナドは構造化定理に必要な要素を自然に記
述できて、なおかつ簡潔であるから
46. IOモナドの功罪
• モナドに関するよくある誤解
– モナドってpurely functional languageでIOする
ためにあるんでしょ?
• モナドはIOのためにあるのではありません
• モナドはIOのためにあるのではありません
– 大事なことなので
50. MTL (Monad Transformer Library)
• 標準のモナドラブラリ
– Preludeのモナドを大幅強化
• これらのものを含む
– 幾つかの標準的なモナド
– これらのモナドを合成するための
モナド変換子(Monad Transformers)
51. MTLに含まれるモナド
• Monad.Cont (継続)
• Monad.Reader (ReadOnly状態)
• Monad.Writer (ログ出力)
• Monad.State (Mutable状態)
• Monad.List (非決定計算)
• Monad.Error (エラーハンドリング)
• これに加え、それぞれのモナド変換子版
57. 中盤まとめ
• モナドとは >>= と return の2つの演算が定
義されたもの
• 標準データ型の多くのものがモナドに
なっている
• mtlというモナド変換子ラブラリがある
• モナド変換子を用いてモナドを組み合わ
せる
• モナド持ち上げで型の異なるモナドを張
り合わせる
71. ※ IOモナドについて(1)
• IOモナドは、Haskellのプログラムの中では外
すことのできないモナドです
– unsafePerformIO などを除いて
• その結果、IOを呼ぶコードはそれ自身がIOを
行わなくても、IOモナドにする必要がありま
す
• Haskellによくある批判として、まともなプロ
グラムを書いているとほとんどすべての関数
の型がIOになる、というのがあります
– IOモナドは感染するとか言われます
72. ※ IOモナドについて(2)
• そこでMonadIOの出番です
• IOが必要なコンテクストについてのみ、
MonadIOを要求させておけば良くなります
• Pureなモナドに関しては、具体的な型が決
定するに従って、自動で持ち上げられる
ことになります
• つまり、PureなコードとIOのコードのオー
バーロードが可能になるということです
73. 3) MonadControlIOの
ンスタンスにする
• あなたのモナドが例外を正しく扱えるよ
うにするために、MonadControlIOのンス
タンスにしましょう
– これがないと bracket などが正しく後処理でき
ません
75. 5) Functor, Applicative
のンスタンスにする
• Applicativeスタルというものがあります
– http://d.hatena.ne.jp/kazu-yamamoto/20101211/1292021817
– などを参照
• あなたのモナドをFunctor, Applicativeの
ンスタンスにすると、使い勝手が大幅に
向上します
• 必ずこれらのンスタンスにしましょう
– Monadのンスタンスは必ずFunctor及び
Applicativeのンスタンスにできます
77. ※ Alternativeクラスについて
• m1 <|> m2 なる演算子が定義されている
• m1が失敗したとき、m2の結果
• Alternativeの任意のンスタンスに対して
– many p – pを失敗するまで繰り返し
– some p – pを失敗するまで1回以上繰り返し
– optional p – p が失敗したらNothing成功したら
Just aを返す
– これらを定義することができる
79. 後半まとめ
• モナドを作るにあたって
– MTLのモナドの組み合わせで実現できないか
考える
– いろいろなクラスのンスタンスにしておく
– モナド以外の有用なクラスが標準にあるので
それのンスタンスにもする