SlideShare a Scribd company logo
1 of 79
Download to read offline
函数プログラミングの集い2011
    チュートリゕル
   「モナドについて」
 株式会社 Preffered Infrastructure
       田中 英行
   tanaka.hideyuki@gmail.com
自己紹介
• 田中英行 (@tanakh, id:tanakh)
• 株式会社 Preferred Infrastructure (PFI) 勤務
    – 検索エンジンのゕルゴリズムとか作ってます
•   Haskell (2004~)
•   C++ (1998~)
•   BASIC (1992~)
•   プログラミングコンテスト愛好家
    – ICPC, ICFPC, CodeJam, TopCoder, …
本日の概要
• モナドとは?
• モナドの使い方
 – モナドのセマンテゖクス
 – 典型的なモナドの例
 – Haskellでのモナド
• モナドの作り方
 – モナドの゗ンスタンスに
 – モナド変換子
What is Monad?

モナドとは?
モナドとは何か?
• 非常に難しい質問です
• 既に数多くの人がそれに答えようとして
  います
 – そして各々が一見全く違う主張をしている
幾つかの例
『モナドは象である』
『モナドはメタフゔーではない』
『プログラマブル・コンテナ』
『コンベゕのゕナロジー』




        from “All About Monads”
いろいろありますが…
• 結局モナドとはなんなのか?




             モナドの力の秘密、
             いつか解き明かしてみたいな…
モナドについての疑問
• 疑問にもいろいろある
 – モナドとは何か?
 – 何の役に立つのか?
 – なぜモナドなのか?
   モナドがもてはやされるのか?
  • ゕローとモナド、どうして差がついた…
• それぞれについて、私なりの見解
モナドとは何なのか?
• モナドとはパラダ゗ムである !
抽象的な話
パラダ゗ム?
• プログラミングパラダ゗ム
 – 手続き型
 – 関数型
 – 論理型
 – オブジェクト志向

 – モナデゖック(?)
  • ここじゃない
モナドとは手続き型パラダ゗ムの
    再定義である
• プログラミングパラダ゗ム
 – 手続き型
  • モナデゖック
 – 関数型
 – 論理型
 – オブジェクト志向
意味的側面からの
    モナドのメタフゔー
• モナドは『プログラマブルセミコロン』
  である
Programmable Semicolon
• Real World Haskell より
手続き型言語と構造化定理
• プログラムは、「順次・反復・分岐」の
  基本的な構造の組み合わせによって記述
  できる
• これらはモナドへ直接的にマッピングで
  きる
それで、何が嬉しいの?
• 分岐のセマンテゖクス書き換え
• 反復のセマンテゖクス書き換え
 – そういうことができる言語は過去にはあった
• 逐次のセマンテゖクス書き換え
 – かつて無いもの(…の様な気がします)!
逐次のセマンテゖクス
• およそほとんどの手続き型言語では、
  セミコロンの意味は変えられない
 – 空気のような存在
• セミコロンの意味を変えることの意義が
  伝統的に見逃されて来たのではないか?
 int main()
 {                 main =
   foo(); bar();     foo >> bar
 }
継続との関係
• モナドは継続(continuation)の一般化とも考
  えることができます
• 継続=各セミコロンにおけるプログラム
  の状態
• モナドはセミコロンを記述するわけなの
  で、その状態を取り出すことは簡単
 – 実際に継続モナドというものがあります
セミコロンをいじることにより
     可能になること
• 普通のプログラムを非決定計算に変える
• 普通のプログラムにエラーハンドリング
  を(プログラムを書き換えずに)追加する
• 普通のプログラムに暗黙の状態を導入す
  る
コンテクスト
• 具体的なモナドに対して、それが計算に
  付加価値を与えます。それを(計算の)
  コンテクストと呼ぶことにします
 – つまり、モナドというのはコンテクスト付き
   の計算ということができる
• 例えば…
 – monad:リストモナド → ctx:非決定性
 – monad:Stateモナド → ctx:mutableな状態
 – etc …
それぞれにそういうプログラムを
書けばいいんじゃないんですか?
• コンテクストごとに異なる記法
• コンテクストごとに異なるプログラム
• コンテクストごとに異なる語彙
 ・・・



         抽象化の欠如
コンテクストの抽象化
• 共通のゕルゴリズムの記述
• 共通のコード片の抽象化




     よりメタレベルの抽象化へ
床下配線のゕナロジー
• モナドによるセミコロンの抽象化は
  床下配線と例えられることも
 – 見えないところを書き換える
少し具体的な話
例
• N-ク゗ーン問題
 – Int が与えられて解を返す
 – 解とはなんぞや?
  • 全解列挙
  • どれか一つを見つける
  • 一番いい解を頼む
 – いろいろ考えうる
N-Queen問題
• モナデゖックに書くと、これらを統一的
  に扱える
 – 解の列挙のストラテジをモナドとして記述
 – 問題を解くゕルゴリズムからの分離
前半まとめ
• モナドとは何なのか?
 – 計算コンテクストの抽象化である
• なんでそれが嬉しいの?
 – 具体的なコンテクストに依存しないコードを
   書ける
 – 抽象化したものを具体的なコードにできる
• なぜモナドなの?
 – モナドは構造化定理に必要な要素を自然に記
   述できて、なおかつ簡潔であるから
三行で言うと

• モナドは関数レベルで
 • メタプログラミング
 • するためのものです



  (´・_・`)えっ…?
How to use Monads

モナド入門・モナドの使い方
実装レベルのお話
モナドとは
• “ある特定の方法”で組み合わせることので
  きる計算のことをまとめて、


      モナド
と呼びます。
ちなみに
• 組み合わせ可能な計算はモナドだけではあり
  ません
 – いろいろな抽象化におけるそれが存在
• 例えば、
 –   関数 (関数合成)
 –   フゔンクタ (関手)
 –   ゕプリカテゖブ・フゔンクタ
 –   ゕロー
 –   Iteratee
 –   etc…
ひとまず置いておいて、
Haskellでのモナドのお話
Haskellでのモナド
• 次のような型クラス




これの゗ンスタンスが具体的なモナド=
計算コンテクスト
モナドになっている標準データ型

• 標準データ型の中にもモナドがある
 – リスト
 – Maybe
 – Either
 – IO
モナド則の必要性
• モナド則は、モナドを安全に組み合わせ
  るのに必要
 – これらの挙動が同じでなければ、組み合わせ
   方によって意味が変わるということになる
Haskellのdo記法
• Haskellではモナドを非常によく使うので、
  専用の構文糖衣が用意されています
高度なモナドの使い方
リストモナド
• リストはモナドにできる
• リストは非決定
  計算のコンテクスト
  と捉えることが
  できる
Maybeモナド
• Maybeもモナド
• 失敗するかもしれない計算
IOモナド
• 入出力を行う可能性のある計算
• HaskellではIOモナドを介してしか入出力を
  扱えない
IOモナドの功罪
• モナドに関するよくある誤解
 – モナドってpurely functional languageでIOする
   ためにあるんでしょ?


• モナドはIOのためにあるのではありません
• モナドはIOのためにあるのではありません
 – 大事なことなので
モナド則
• すべてのモナドは次のモナド則を満たす
  ”べき”である
 – 満たす保証をするのはプログラマの責任
 – あえて満たさなくても良い
モナド変換子(Monad Transformers)

• モナドとモナドを組み合わせるもの
 – (cf. 計算と計算を組み合わせるものがモナド)
動機
• 複数の計算コンテクストを合成したい
 – 失敗するかもしれないIO計算
 – エラーハンドリングできるパーザー
 – etc, …
MTL (Monad Transformer Library)
• 標準のモナドラ゗ブラリ
 – Preludeのモナドを大幅強化
• これらのものを含む
 – 幾つかの標準的なモナド
 – これらのモナドを合成するための
   モナド変換子(Monad Transformers)
MTLに含まれるモナド
•   Monad.Cont (継続)
•   Monad.Reader (ReadOnly状態)
•   Monad.Writer (ログ出力)
•   Monad.State (Mutable状態)
•   Monad.List (非決定計算)
•   Monad.Error (エラーハンドリング)

• これに加え、それぞれのモナド変換子版
モナド変換子
• 2つのモナドを合成するためのもの
• 例えばStateモナドの場合:
 – StateT s m a
    • モナド変換子版Stateモナド
    • State s a と比べて、mというパラメータが追加
    • mに合成したいモナドを代入
 – StateT s IO a
    • IOモナドを内包したStateモナド
    • IOモナドの操作とStateモナドの操作が両方できる
持ち上げ(lift)
• StateT s IO の例




  – StateT s IO の中でIOを行うには、持ち上げ(lift)
    を行う必要がある(型が合わないので)
モナドクラス
• 例えばIOを行うだけの計算

• これは、StateT s IO 以外のモナドでも使え
  て欲しい
 – ErrorT err IO
 – ReaderT s IO
 –…
MonadIOクラス
• そのために、IOをliftできるクラス全体を抽象
  化したMonadIOクラスを定義


• 先のコードは次のような型に


• StateT s IO などをMonadIOの゗ンスタンスに
  すれば使用可能に。
一般の持ち上げ
• モナド変換子に渡されるモナドはIOだけで
  はない
 – ネストする場合もある
• 一般ケースのために、MonadTransという
  クラスが用意されている


 – 内側のモナド外側のモナドに持ち上げること
   ができる
中盤まとめ
• モナドとは >>= と return の2つの演算が定
  義されたもの
• 標準データ型の多くのものがモナドに
  なっている
• mtlというモナド変換子ラ゗ブラリがある
• モナド変換子を用いてモナドを組み合わ
  せる
• モナド持ち上げで型の異なるモナドを張
  り合わせる
Advanced Topics
monad-control (1)
• liftの逆をするもの
• 動機
 – Haskellの例外ハンドリング機構はIOモナド
   ベース
 – 渡せるものがIO固定
   • MonadIO に対しても例外ハンドルしたい
monad-control (2)
• MonadIOに対して一般化




• それを行えるようにするために、
  MonadControlIOというクラスを用意
モナドいろいろ
• 近年実に様々なラ゗ブラリがモナデゖッ
  クラ゗ブラリとして提供されるようにな
  りました
• それらの一部を紹介していきたいと思い
  ます
MonadPar
• 並列計算を記述するためのモナド
 – `par`, `seq` などをモナド化したもの
Parser
• パーザいろいろ
 – Parsec, Attoparsec, trifecta
WebApp
• WAI, Yesod, Snap, CGI, …
Interpreter
• hint, BASIC, …
How to design your monads

モナドの作り方
モナドを設計するにあたって
• 自分のラ゗ブラリが、モナドとして抽象
  化できることに気づいたとします
• しかし、モナドの作り方を間違うと、非
  常に使い勝手の悪いものができてしまい
  ます
 – 使い勝手のよいモナドの実装には気をつける
   べきことが沢山あります
• ここまで紹介したことはすべて理解して
  おくことが望ましいです
1) 既存のモナドが利用できないか

• 実際のところ、mtlに含まれるモナドで、
  ほとんどのケースはカバーされます
• 作りたい計算が、mtlにあるモナドの組み
  合わせで実現できないかまず検討するべ
  きです
2) モナド変換子版を用意する
• いざモナドを作るとなったら、(原理的に)
  可能なのであれば、モナド変換子版を必
  ず用意しましょう
 – モナド変換子にはHogeTと、末尾に大文字Tを
   つけるのが慣習です
• 非モナド変換子版は、モナド変換子版に
  Identityモナドを代入したものにします
 – 実装を重複させてはいけません
MonadIOクラスの゗ンスタンスにする

• あなたのモナドをMonadIOの゗ンスタンス
  にしておくのはとても良いことです
• あなたのモナドを利用するすべての場所
  でIOを行うことができるようになります
• MonadIOを用意しておくのはモナドによっ
  てIOを行うHaskellにとっては極めて重要な
  ことです
※ IOモナドについて(1)
• IOモナドは、Haskellのプログラムの中では外
  すことのできないモナドです
 – unsafePerformIO などを除いて
• その結果、IOを呼ぶコードはそれ自身がIOを
  行わなくても、IOモナドにする必要がありま
  す
• Haskellによくある批判として、まともなプロ
  グラムを書いているとほとんどすべての関数
  の型がIOになる、というのがあります
 – IOモナドは感染するとか言われます
※ IOモナドについて(2)
• そこでMonadIOの出番です
• IOが必要なコンテクストについてのみ、
  MonadIOを要求させておけば良くなります
• Pureなモナドに関しては、具体的な型が決
  定するに従って、自動で持ち上げられる
  ことになります
• つまり、PureなコードとIOのコードのオー
  バーロードが可能になるということです
3) MonadControlIOの
      ゗ンスタンスにする
• あなたのモナドが例外を正しく扱えるよ
  うにするために、MonadControlIOの゗ンス
  タンスにしましょう
 – これがないと bracket などが正しく後処理でき
   ません
4) MonadTransの゗ンスタンスにする
• あなたのモナド変換子が、他のモナドを
  自動多段持ち上げ可能になるように(可能
  であれば)必ず、MonadTransの゗ンスタン
  スにしましょう
5) Functor, Applicative
         の゗ンスタンスにする
• Applicativeスタ゗ルというものがあります
 – http://d.hatena.ne.jp/kazu-yamamoto/20101211/1292021817
 – などを参照

• あなたのモナドをFunctor, Applicativeの゗
  ンスタンスにすると、使い勝手が大幅に
  向上します
• 必ずこれらの゗ンスタンスにしましょう
 – Monadの゗ンスタンスは必ずFunctor及び
   Applicativeの゗ンスタンスにできます
6) 必要に応じて、その他
• その他のモナドクラスの゗ンスタンスに
  します
 – エラーハンドリングを付けたいなら、
   MonadError
 – 失敗に対する代替を与えたいときには、
   Alternative
※ Alternativeクラスについて
• m1 <|> m2 なる演算子が定義されている
• m1が失敗したとき、m2の結果

• Alternativeの任意の゗ンスタンスに対して
 – many p – pを失敗するまで繰り返し
 – some p – pを失敗するまで1回以上繰り返し
 – optional p – p が失敗したらNothing成功したら
   Just aを返す
 – これらを定義することができる
GenericNewtypeDeriving
• 自分のモナドをこれらすべての゗ンスタ
  ンスにするのは骨の折れる作業です
• モナドがnewtypeの時、これをderiving で
  済ませることができます
 – -XGenericNewtypeDeriving 言語拡張
後半まとめ
• モナドを作るにあたって
 – MTLのモナドの組み合わせで実現できないか
   考える
 – いろいろなクラスの゗ンスタンスにしておく
 – モナド以外の有用なクラスが標準にあるので
   それの゗ンスタンスにもする

More Related Content

What's hot

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントIosif Takakura
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!Genya Murakami
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道nishio
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門sohta
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All ThingsUnityTechnologiesJapan002
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するYoshifumi Kawai
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだGenya Murakami
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼうxenophobia__
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかShunsukeNakamura17
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底Hiromi Ishii
 

What's hot (20)

暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Sphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメントSphinxでまとめる多言語環境APIドキュメント
Sphinxでまとめる多言語環境APIドキュメント
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
If文から機械学習への道
If文から機械学習への道If文から機械学習への道
If文から機械学習への道
 
ClojureではじめるSTM入門
ClojureではじめるSTM入門ClojureではじめるSTM入門
ClojureではじめるSTM入門
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭するCEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
すごい配列楽しく学ぼう
すごい配列楽しく学ぼうすごい配列楽しく学ぼう
すごい配列楽しく学ぼう
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
Rustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったかRustに触れて私のPythonはどう変わったか
Rustに触れて私のPythonはどう変わったか
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底技術者が知るべき Gröbner 基底
技術者が知るべき Gröbner 基底
 
Map
MapMap
Map
 

Similar to Monad tutorial

An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monadsKousuke Ruichi
 
Mplusの使い方 初級編
Mplusの使い方 初級編Mplusの使い方 初級編
Mplusの使い方 初級編Hiroshi Shimizu
 
すごいMonad入門
すごいMonad入門すごいMonad入門
すごいMonad入門真一 北原
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースHajime Yanagawa
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介Akira Tanaka
 
iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"Ryohei Suzuki
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかKousuke Ruichi
 
Movable Type for AWS を用いた環境構築のポイント
Movable Type for AWS を用いた環境構築のポイントMovable Type for AWS を用いた環境構築のポイント
Movable Type for AWS を用いた環境構築のポイントMakoto Tajima
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Xtext And Grails20091218
Xtext And Grails20091218Xtext And Grails20091218
Xtext And Grails20091218Akira Tanaka
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用2019-04-17 「不適切コンテンツ検出」の機械化と安定運用
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用Yasuhiko Iwase
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)nishikawa_makoto7
 
ニューラル機械翻訳の動向@IBIS2017
ニューラル機械翻訳の動向@IBIS2017ニューラル機械翻訳の動向@IBIS2017
ニューラル機械翻訳の動向@IBIS2017Toshiaki Nakazawa
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Tomoharu ASAMI
 
NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告Hiroyuki TOKUNAGA
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方Shigenori Sagawa
 

Similar to Monad tutorial (20)

An engineer uses monads
An engineer uses monadsAn engineer uses monads
An engineer uses monads
 
Mplusの使い方 初級編
Mplusの使い方 初級編Mplusの使い方 初級編
Mplusの使い方 初級編
 
すごいMonad入門
すごいMonad入門すごいMonad入門
すごいMonad入門
 
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェースモジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
Oss coding style
Oss coding styleOss coding style
Oss coding style
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"iii_SGMI #5 "OOP & Design Patterns"
iii_SGMI #5 "OOP & Design Patterns"
 
Haskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのかHaskell Day2012 - 参照透過性とは何だったのか
Haskell Day2012 - 参照透過性とは何だったのか
 
Movable Type for AWS を用いた環境構築のポイント
Movable Type for AWS を用いた環境構築のポイントMovable Type for AWS を用いた環境構築のポイント
Movable Type for AWS を用いた環境構築のポイント
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Xtext And Grails20091218
Xtext And Grails20091218Xtext And Grails20091218
Xtext And Grails20091218
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用2019-04-17 「不適切コンテンツ検出」の機械化と安定運用
2019-04-17 「不適切コンテンツ検出」の機械化と安定運用
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)PFPファシグラ(2009/07/03)
PFPファシグラ(2009/07/03)
 
ニューラル機械翻訳の動向@IBIS2017
ニューラル機械翻訳の動向@IBIS2017ニューラル機械翻訳の動向@IBIS2017
ニューラル機械翻訳の動向@IBIS2017
 
Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉Object-Functional Analysis and Design and Programming温泉
Object-Functional Analysis and Design and Programming温泉
 
NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告NLP若手の回 ACL2012参加報告
NLP若手の回 ACL2012参加報告
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 

More from Hideyuki Tanaka

ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...Hideyuki Tanaka
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書くHideyuki Tanaka
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 

More from Hideyuki Tanaka (7)

ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...
 
Xpath in-lens
Xpath in-lensXpath in-lens
Xpath in-lens
 
IdrisでWebアプリを書く
IdrisでWebアプリを書くIdrisでWebアプリを書く
IdrisでWebアプリを書く
 
手書きスライド
手書きスライド手書きスライド
手書きスライド
 
Yesod勉強会
Yesod勉強会Yesod勉強会
Yesod勉強会
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Icfp2009
Icfp2009Icfp2009
Icfp2009
 

Recently uploaded

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 

Recently uploaded (9)

クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 

Monad tutorial