Mercurial > hg > Members > atton > generated_seminar_slides
view slides/20140909/slide.html @ 43:14da4e3ec832
auto-Update generated slides by script
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 09 Sep 2014 17:20:47 +0900 |
parents | |
children | d4e4ecc1c347 |
line wrap: on
line source
<!DOCTYPE HTML> <html lang="Japanese"> <head> <title>プログラムのデバッグ支援</title> <meta charset="UTF-8"> <meta name="viewport" content="width=1274, user-scalable=no"> <meta name="generator" content="Slide Show (S9)"> <meta name="author" content="Yasutaka Higa"> <link rel="stylesheet" href="themes/ribbon/styles/style.css"> <style> #Cover H2 { color:#FFF; text-align:center; font-size:70px; } </style> </head> <body class="list"> <header class="caption"> <h1>プログラムのデバッグ支援</h1> <p>Yasutaka Higa</p> </header> <div class="slide bg" id="Cover"><div> <section> <header> <h2>プログラムのデバッグ支援</h2> </header> <img src="pictures/" alt=""> <!-- © John Carey, http://fiftyfootshadows.net/ --> </section> </div></div> <!-- todo: add slide.classes to div --> <!-- todo: create slide id from header? like a slug in blogs? --> <div class="slide" id="2"><div> <section> <header> <h1 id="section">研究目的</h1> </header> <!-- === begin markdown block === generated by markdown 1.1.1 on Ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0] on 2014-09-09 17:20:46 +0900 with Markdown engine kramdown (1.4.1) using options {} --> <!-- _S9SLIDE_ --> <ul> <li>プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる</li> <li>しかしリファクタリングにおいてはソースコードを変更した後も同じ結果を得たい</li> <li>ソースコードの改変をモナドとして記述し、実行結果の変化を自動的に検出したい</li> <li>これによりリファクタリング支援や後方互換性の支援などを行なう</li> </ul> </section> </div></div> <div class="slide" id="3"><div> <section> <header> <h1 id="section-1">近況報告</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Deifine Simple Similar <ul> <li>Similar</li> <li>Similar as Functor</li> <li>Similar as Applicative Functor</li> <li>Similar as Monad</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="4"><div> <section> <header> <h1 id="similar">Similar</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>List みたいな感じになりました</li> </ul> <pre><code>data Similar a = Single a | Similar a (Similar a) </code></pre> <ul> <li>オリジナルの関数は Single で値を包んでおく必要がある <ul> <li>全てはモナド、って伏線がここで</li> </ul> </li> <li>似てる関数は、その値を a に、とオリジナルの関数をsimilarする</li> </ul> </section> </div></div> <div class="slide" id="5"><div> <section> <header> <h1 id="similar-syntax">Similar Syntax</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>オリジナルの関数は Single で値を包んでおく必要がある <ul> <li>こうしておかないと、リファクタリング時にオリジナルの関数を修正する必要が出てくる</li> <li>とは言え関数を呼び出す側は変更しなくてはならないのでリファクタリング時にプログラムが全く変更されない訳では無い</li> </ul> </li> <li>その変わり「関数Aをリファクタリングした関数Bをリファクタリングした関数C」も扱える</li> </ul> </section> </div></div> <div class="slide" id="6"><div> <section> <header> <h1 id="similar-syntax-example">Similar Syntax Example</h1> </header> <!-- _S9SLIDE_ --> <pre><code>double :: Int -> Similar Int double x = Single (2 * x) twicePlus :: Int -> Similar Int twicePlus x = Similar (x + x) (double x) </code></pre> </section> </div></div> <div class="slide" id="7"><div> <section> <header> <h1 id="similar-as-functor">Similar as Functor</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Functor は関数 f を全ての要素に与える <ul> <li>List っぽい</li> </ul> </li> </ul> <pre><code>instance Functor Similar where fmap f (Single a) = Single (f a) fmap f (Similar a s) = Similar (f a) (fmap f s) </code></pre> </section> </div></div> <div class="slide" id="8"><div> <section> <header> <h1 id="similar-as-monad">Similar as Monad</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>mu は Similar (Similar a) -> Similar a</li> <li>List の List みたいな感じで一旦 flatten する必要が</li> <li>Similar (Similar a) はこんなの</li> </ul> <pre><code>Similar (Single (Similar 1 (Single 1))) (Single (Single (Similar 1 (Single 1)))) </code></pre> </section> </div></div> <div class="slide" id="9"><div> <section> <header> <h1 id="definition--mu">Definition : mu</h1> </header> <!-- _S9SLIDE_ --> <pre><code>mu :: (Similar (Similar a)) -> Similar a mu (Single s) = s mu (Similar s ss) = similar s (mu ss) </code></pre> <ul> <li>similar は list で言う append みたいな</li> <li>mu の中で変更を検出しても良いが Eq の instance である必要がある</li> <li>なので最後の時に値比較をすることに <ul> <li>値比較 + debugger で追いたい情報を埋めこんでおくと良い?</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="10"><div> <section> <header> <h1 id="definition--similar-as-monad">Definition : Similar as Monad</h1> </header> <!-- _S9SLIDE_ --> <pre><code>instance Monad Similar where return = Single (Single x) >>= f = f x (Similar x s) >>= f = mu $ Similar (f x) (fmap f s) </code></pre> <ul> <li>Similar (f x) (fmap f s) の type が (Similar (Similar a))</li> </ul> </section> </div></div> <div class="slide" id="11"><div> <section> <header> <h1 id="get-value--similar">Get value : Similar</h1> </header> <!-- _S9SLIDE_ --> <pre><code>same :: (Eq a) => Similar a -> a same (Single x) = x same (Similar x s) = if x == (same s) then x else (error "same") </code></pre> <ul> <li>今は値が違う、というエラーメッセージのみ</li> </ul> </section> </div></div> <div class="slide" id="12"><div> <section> <header> <h1 id="get-value--similar-1">Get value : Similar</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>こっちは値比較無し</li> <li>問答無用で正しく動いている方を取る</li> </ul> <pre><code>value :: Similar a -> a value (Single x) = x value (Similar x s) = value s </code></pre> </section> </div></div> <div class="slide" id="13"><div> <section> <header> <h1 id="execution-samples--bind">Execution Samples : bind</h1> </header> <!-- _S9SLIDE_ --> <pre><code>*Main> return 100 >>= double >>= twicePlus Similar 400 (Single 400) *Main> return 100 >>= double >>= twicePlus >>= plusTwo Similar 402 (Similar 800 (Similar 402 (Single 800))) </code></pre> </section> </div></div> <div class="slide" id="14"><div> <section> <header> <h1 id="execution-samples--get-value">Execution Samples : Get value</h1> </header> <!-- _S9SLIDE_ --> <pre><code>*Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo *** Exception: same *Main> same $ return 100 >>= double >>= twicePlus 400 </code></pre> </section> </div></div> <div class="slide" id="15"><div> <section> <header> <h1 id="similar-as-applicative-functor">Similar as Applicative Functor</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>ghc 7.8.3 から Monad の instance にするには Applicative にもしておくこと推奨</li> <li>Similar 内に function が入ってる場合の挙動 <ul> <li>T f みたいな状態</li> </ul> </li> <li>こっちも List っぽい感じで全てのパターンを作ってしまう</li> </ul> </section> </div></div> <div class="slide" id="16"><div> <section> <header> <h1 id="define--similar-as-applicative-functor">Define : Similar as Applicative Functor</h1> </header> <!-- _S9SLIDE_ --> <pre><code>instance Applicative Similar where pure = Single (Single f) <*> s = fmap f s (Similar f s) <*> ss = similar (fmap f ss) (s <*> ss) </code></pre> </section> </div></div> <div class="slide" id="17"><div> <section> <header> <h1 id="summary">summary</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>List (non-deterministic Monad) っぽい <ul> <li>debugger info の埋め込み</li> <li>どんな関数がどんな順番で呼ばれたか</li> </ul> </li> <li>Functor raw, Monad raw <ul> <li>証明しておく必要が</li> <li>特に Monoid なのかどうか</li> </ul> </li> </ul> <!-- vim: set filetype=markdown.slide: --> <!-- === end markdown block === --> </section> </div></div> <!-- To hide progress bar from entire presentation just remove “progress” element. --> <div class="progress"><div></div></div> <script src="scripts/script.js"></script> <!-- Copyright © 2010–2011 Vadim Makeev, http://pepelsbey.net/ --> </body> </html>