20120509_桂_monad.pdf

E60aa4f80303f3f386898546ddb3686a?s=47 Livesense Inc.
April 23, 2014
18

 20120509_桂_monad.pdf

E60aa4f80303f3f386898546ddb3686a?s=128

Livesense Inc.

April 23, 2014
Tweet

Transcript

  1. Monad katsura@livesense.co.jp

  2. 定義 1 (メタグラフ metagraph) メタグラフは射 (arrow) と対象 (object) というデータからなる.各射には演算 dom,cod

    が定義されており,これらは射を受け取り対 象を返す関数である.射 f に対して domf をf ソース, codf を f のターゲットと呼ぶ.定義 2 (圏 category) メ タ圏 (metacategory) は次の演算が定義されたメタグ ラフである.圏をメタ圏と区別するときは,集合論への 任意の翻訳を意味するが,本稿ではこれ以降,メタ圏 を単に圏と呼ぶ.各対象には演算 id が定義されてお り,これは対象 a を受け取りその対象をソースとし,か つターゲットとするような恒等射 (identity arrow)ida =
  3. None
  4. 純粋・・・関数型・・?? 使えるとかっこいいけど 使わないやつ ヘラクレスオオカブト なんか難しそう

  5. #!php function fib($n) { if ($n <= 1) { return

    1; } $fib = array(1, 1); foreach (range(1, $n - 1) as $i) { $fib[] = array_sum(array_slice($fib, -2, 2)); } return array_pop($fib); } echo fib(20); // 10946
  6. #!ruby def fib(n) return 1 if n <= 1 fib

    = [1,1] (n - 1).times.each do fib = fib.last(2).inject { |x, sum| sum += x } end fib.last end p fib(20) # 10946
  7. #!haskell fib = 1:1:zipWith (+) fib (tail fib) main =

    putStrLn $ show $ fib !! 20 -- 10946
  8. #!perl6 my @fib := 1, 1, * + * ...

    *; say @fib[20]; # 10946
  9. 純粋関数型言語の「純粋関数」 純粋関数 • 同じ引数を渡すと、いつでも同じ戻り値が返る • 関数外部とのやりとりがない メリット • テストしやすい •

    バグが起きにくい • 並列化しやすい • 遅延評価できる • 見通しが良い
  10. 誰でもわかるMonadの必要性 • 純粋関数は副作用なし • 引数から戻り値を算出。外部とのやりとりなし。 • 画面に値表示するのどうやるの? • →破綻 •

    Monad使えばいいんじゃね? ←いまここ
  11. Monadのイメージ • 純粋関数だとIO出来ないからコンテナ化する的 な? • ラッパー?コンテナ?みたいなやつ? • Monadがないと困るのは何となくわかるけど、 なんでMonadなの? •

    Maybe MonadってScalaのオプションみたいな やつでしょ?
  12. 今日のゴール Monadの「動機」だけじゃなく、「Monadが何か」ま で理解する。 やらないこと do記法、IO Monad、圏論のお話

  13. Monadとは何か! Monad以外の何かではない。

  14. 強いて言うなら! 合成戦略に重きを置いたプログラマブルコンテナ。 結果的に計算と合成を切り離すことができ、またIO など外部とのやりとりも切り離すことができる。

  15. コードでお願いします。 OK.

  16. # Option in Scala interface Option public function getOrElse($alter) class

    Some implements Option private $v; public function getOrElse($alter) return $this->v; class None implements Option public function getOrElse($alter) return $alter; echo $hash->get("key")->getOrElse(0);
  17. Monadを使用しない計算の弱点 • 値の受け渡しにクラスが関与出来ない echo $hash1->get("hash2")->getOrElse(new Hash())->get("hash3")->getOrElse(0); • こう書けたら便利 echo $hash1->get("hash2")=>get("hash3")-

    >getOrElse(0);
  18. interface Maybe public function getOrElse($alter) class Just implements Maybe private

    $v; public function getOrElse($alter) return $this->v; public function =>($func, $args) return $this->v->$func(*$args); class Nothing implements Maybe public function getOrElse($alter) return $alter; public function =>($func, $args) return Nothing;
  19. これ、Monad。 このサンプルの • Maybeという型の名前 (型構成子m) • new Just($v) コンストラクタ (unit)

    • =>オペレーター (bind)。 の3つを併せてMonadと言う。 但し、この3つがMonad lawを満たしていることが必 須。
  20. Monad Law 1. (return x) >>= f == f x

    2. m >>= return == m 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
  21. さっきのコードでお願いします。 OK.

  22. interface Maybe public function getOrElse($alter) class Just implements Maybe private

    $v; public function getOrElse($alter) return $this->v; public function =>($func, $args) return $this->v->$func(*$args); class Nothing implements Maybe public function getOrElse($alter) return $alter; public function =>($func, $args) return Nothing;
  23. Monad Law 1. (return x) >>= f == f x

    new Just($hash)=>get("key") == $hash->get ("key") 2. m >>= return == m new Just($hash)=>(Just::__constructor) == new Just($hash) 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g) new Just($hash)=>get("key1")=>get("key2") == new Just($hash)=>(function ($m) { return $m- >get("key1")=>get("key2"); })
  24. 大事なのは... =>演算子はgetメソッドの動きを変えている。 ↓ 次の計算との合成を=>が担っている。 ↓ 合成戦略をMonadが担っている。 ↓ 合成戦略が計算から切り離されている。

  25. ポイントは... =>演算子の次に来る関数は「ふつうの値を引数に とり、モナドを返す」。じゃないと合成出来ない。 Haskell的に言うと (>>=) :: (Monad m) => m

    a -> (a -> m b) -> m b となる。ちなみに >>= (m a) (a -> m b) // return m b は m a >>= (a -> m b) // return m b になる。(演算子は中置に出来る。)
  26. この調子で他のMonadも! OK.

  27. List Monad class List private $v; public function __constructor($v) $this->v

    = [$v]; public function =>($func) return array_merge( array_map($func, $this->v) ); // =>の引数に来るfuncは必ずMonad(List)を返す!
  28. code sample $splitX = function ($x) { return [$x-1, $x+1];

    } $filterX = function ($x) { return $x > 0 ? [$x] : []; } [1,2,3]=>$splitX=>$filterX // [2,1,3,2,4]
  29. code sample in haskell splitX x = [x-1, x+1] filterX

    x | x > 0 = [x] filterX _ = [] [1,2,3] >>= splitX >>= filterX -- [2,1,3,2,4]
  30. Monad Lawは? 1. (return x) >>= f == f x

    new List($x)=>split == split($x) 2. m >>= return == m new List($x)=>(List::__constructor) == new List($x) 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g) new List($x)=>split=>filter == new List($x)=>(function ($x) { return $x- >split=>filter; })
  31. 何が便利なの? ふつうの言語のList queue, stack的使い方中心 iterate中心 手続き中心 HaskellのList 組み合わせ中心 再帰関数中心 伸縮中心

  32. 結局、Monadは何だったか。 • コンテナ(a -> m a)だった? • 但し、合成をコンテナクラスで規定出来る • 「順次的な計算」と「合成戦略」を規定する

    • どちらも動機に成り得る(つまり前者がIOで、後 者がMaybe, List)
  33. IO Monadについて少しだけ教えて • String -> IO String • bindはStringの連結 •

    IO Monadを合成しまくって最後に出力
  34. Monadを調べると圏論の話が出てくる? • とりあえず一番わかりやすいのはこれ • http://kurt.scitec.kobe-u.ac. jp/~shg/SFCArchives/docs/shortcut_monad. pdf • 圏論(Category Theory)は集合間の変換に関す

    る手立て。その変換(arrow)を定義する過程にお いて、いくつかの約束事が定められた圏が存在 する。クライスリ圏はその1つであり、その変換 手順であるクライスリトリプルがHaskellのMonad と一緒。
  35. 参考文献 Monad (functional programming) - Wikipedia, the free encyclopedia  http://en.wikipedia.org/wiki/Monads_in_functional_programming

    JavaScriptによるテンプレート・モナド、すっげー簡単! - 檜山正幸のキマイラ飼育記  http://d.hatena.ne.jp/m-hiyama/20070130/1170120740 モナドのたぐいとフレイド圏 - 檜山正幸のキマイラ飼育記  http://d.hatena.ne.jp/m-hiyama/20111028/1319764607 世界で一番か二番くらいにやさしい「モナド入門」 - 檜山正幸のキマイラ飼育記  http://d.hatena.ne.jp/m-hiyama/20060419/1145432492 All About Monads  http://www.sampou.org/haskell/a-a-monads/html/ How to Learn Haskell  http://acm.wustl.edu/functional/haskell.php Monad tutorial (PFI太田さん)  http://www.slideshare.net/tanakh/monad-tutorial リストモナドの動作原理  http://d.hatena.ne.jp/kazu-yamamoto/20090313/1236935179 モナドはメタファーではない  http://eed3si9n.com/ja/monads-are-not-metaphors モナドへの近道・Haskell からの寄道  http://kurt.scitec.kobe-u.ac.jp/~shg/SFCArchives/docs/shortcut_monad.pdf モナドメモ - 圏論におけるモナドの定義  http://www.sharp-bang.jp/prog/monad_memo.html
  36. 次回 数学的お絵かき。 • WebGL • OpenGL • openFrameworks • processing

    (or processing.js) あたりから。