comparison slides/20140909/slide.md @ 69:ed40fd13dc27

Add slide for seminar
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Tue, 09 Sep 2014 17:20:45 +0900
parents
children
comparison
equal deleted inserted replaced
68:8d98d8d5b471 69:ed40fd13dc27
1 title: プログラムのデバッグ支援
2 author: Yasutaka Higa
3 cover:
4 lang: Japanese
5
6
7
8 # 研究目的
9 * プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる
10 * しかしリファクタリングにおいてはソースコードを変更した後も同じ結果を得たい
11 * ソースコードの改変をモナドとして記述し、実行結果の変化を自動的に検出したい
12 * これによりリファクタリング支援や後方互換性の支援などを行なう
13
14
15 # 近況報告
16 * Deifine Simple Similar
17 * Similar
18 * Similar as Functor
19 * Similar as Applicative Functor
20 * Similar as Monad
21
22
23 # Similar
24 * List みたいな感じになりました
25
26 ```
27 data Similar a = Single a | Similar a (Similar a)
28 ```
29
30 * オリジナルの関数は Single で値を包んでおく必要がある
31 * 全てはモナド、って伏線がここで
32 * 似てる関数は、その値を a に、とオリジナルの関数をsimilarする
33
34 # Similar Syntax
35 * オリジナルの関数は Single で値を包んでおく必要がある
36 * こうしておかないと、リファクタリング時にオリジナルの関数を修正する必要が出てくる
37 * とは言え関数を呼び出す側は変更しなくてはならないのでリファクタリング時にプログラムが全く変更されない訳では無い
38 * その変わり「関数Aをリファクタリングした関数Bをリファクタリングした関数C」も扱える
39
40
41 # Similar Syntax Example
42 ```
43 double :: Int -> Similar Int
44 double x = Single (2 * x)
45
46 twicePlus :: Int -> Similar Int
47 twicePlus x = Similar (x + x) (double x)
48 ```
49
50 # Similar as Functor
51 * Functor は関数 f を全ての要素に与える
52 * List っぽい
53
54 ```
55 instance Functor Similar where
56 fmap f (Single a) = Single (f a)
57 fmap f (Similar a s) = Similar (f a) (fmap f s)
58 ```
59
60 # Similar as Monad
61 * mu は Similar (Similar a) -> Similar a
62 * List の List みたいな感じで一旦 flatten する必要が
63 * Similar (Similar a) はこんなの
64
65 ```
66 Similar (Single (Similar 1 (Single 1)))
67 (Single (Single (Similar 1 (Single 1))))
68 ```
69
70 # Definition : mu
71
72 ```
73 mu :: (Similar (Similar a)) -> Similar a
74 mu (Single s) = s
75 mu (Similar s ss) = similar s (mu ss)
76 ```
77
78 * similar は list で言う append みたいな
79 * mu の中で変更を検出しても良いが Eq の instance である必要がある
80 * なので最後の時に値比較をすることに
81 * 値比較 + debugger で追いたい情報を埋めこんでおくと良い?
82
83 # Definition : Similar as Monad
84 ```
85 instance Monad Similar where
86 return = Single
87 (Single x) >>= f = f x
88 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s)
89 ```
90 * Similar (f x) (fmap f s) の type が (Similar (Similar a))
91
92
93 # Get value : Similar
94
95 ```
96 same :: (Eq a) => Similar a -> a
97 same (Single x) = x
98 same (Similar x s) = if x == (same s) then x else (error "same")
99 ```
100
101 * 今は値が違う、というエラーメッセージのみ
102
103
104 # Get value : Similar
105 * こっちは値比較無し
106 * 問答無用で正しく動いている方を取る
107
108 ```
109 value :: Similar a -> a
110 value (Single x) = x
111 value (Similar x s) = value s
112 ```
113
114 # Execution Samples : bind
115 ```
116 *Main> return 100 >>= double >>= twicePlus
117 Similar 400 (Single 400)
118 *Main> return 100 >>= double >>= twicePlus >>= plusTwo
119 Similar 402 (Similar 800 (Similar 402 (Single 800)))
120 ```
121
122 # Execution Samples : Get value
123 ```
124 *Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo
125 *** Exception: same
126 *Main> same $ return 100 >>= double >>= twicePlus
127 400
128 ```
129
130
131
132 # Similar as Applicative Functor
133 * ghc 7.8.3 から Monad の instance にするには Applicative にもしておくこと推奨
134 * Similar 内に function が入ってる場合の挙動
135 * T f みたいな状態
136 * こっちも List っぽい感じで全てのパターンを作ってしまう
137
138 # Define : Similar as Applicative Functor
139 ```
140 instance Applicative Similar where
141 pure = Single
142 (Single f) <*> s = fmap f s
143 (Similar f s) <*> ss = similar (fmap f ss) (s <*> ss)
144 ```
145
146 # summary
147 * List (non-deterministic Monad) っぽい
148 * debugger info の埋め込み
149 * どんな関数がどんな順番で呼ばれたか
150 * Functor raw, Monad raw
151 * 証明しておく必要が
152 * 特に Monoid なのかどうか
153
154 <!-- vim: set filetype=markdown.slide: -->