Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20120509_桂_monad.pdf

Livesense Inc.
April 23, 2014
36

 20120509_桂_monad.pdf

Livesense Inc.

April 23, 2014
Tweet

More Decks by Livesense Inc.

Transcript

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

    が定義されており,これらは射を受け取り対 象を返す関数である.射 f に対して domf をf ソース, codf を f のターゲットと呼ぶ.定義 2 (圏 category) メ タ圏 (metacategory) は次の演算が定義されたメタグ ラフである.圏をメタ圏と区別するときは,集合論への 任意の翻訳を意味するが,本稿ではこれ以降,メタ圏 を単に圏と呼ぶ.各対象には演算 id が定義されてお り,これは対象 a を受け取りその対象をソースとし,か つターゲットとするような恒等射 (identity arrow)ida =
  2. #!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
  3. #!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
  4. #!haskell fib = 1:1:zipWith (+) fib (tail fib) main =

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

    *; say @fib[20]; # 10946
  6. # 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);
  7. 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;
  8. これ、Monad。 このサンプルの • Maybeという型の名前 (型構成子m) • new Just($v) コンストラクタ (unit)

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

    2. m >>= return == m 3. (m >>= f) >>= g == m >>= (\x -> f x >>= g)
  10. 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;
  11. 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"); })
  12. ポイントは... =>演算子の次に来る関数は「ふつうの値を引数に とり、モナドを返す」。じゃないと合成出来ない。 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 になる。(演算子は中置に出来る。)
  13. 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)を返す!
  14. 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]
  15. 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]
  16. 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; })
  17. Monadを調べると圏論の話が出てくる? • とりあえず一番わかりやすいのはこれ • http://kurt.scitec.kobe-u.ac. jp/~shg/SFCArchives/docs/shortcut_monad. pdf • 圏論(Category Theory)は集合間の変換に関す

    る手立て。その変換(arrow)を定義する過程にお いて、いくつかの約束事が定められた圏が存在 する。クライスリ圏はその1つであり、その変換 手順であるクライスリトリプルがHaskellのMonad と一緒。
  18. 参考文献 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