Mercurial > hg > Members > atton > seminar_slides
annotate slides/20140902/slide.md @ 104:4c2f5cc9f676
Add slide for seminar
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 19 May 2015 19:57:16 +0900 |
parents | 309850f23a67 |
children |
rev | line source |
---|---|
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 title: プログラムのデバッグ支援(仮) |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 author: Yasutaka Higa |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 cover: |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 lang: Japanese |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 # 研究目的(仮) |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
10 * プログラミングにおいて、ソースコードを改変するとプログラムの挙動も変わる |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
11 * しかしリファクタリングにおいてはソースコードを変更した後も同じ結果を得たい |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12 * ソースコードの改変をモナドとして記述し、実行結果の変化を自動的に検出したい |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
13 * これによりリファクタリング支援や後方互換性の支援などを行なう |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
14 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
15 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 # 業務連絡 + 近況報告 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
17 * PS4 環境開発詳細? (from 長田先生) |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 * Similar Monad |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19 * as Functor |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 * as Monad (has Constraint) |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
21 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
22 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
23 # Similar Monad |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 * 似てるっぽい関数を記述して実行すると違う時に怒って欲しい |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
25 * 値比較ができるのなら良いのですが |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
26 * /Users/one/hg/Members/atton/similar_monad |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
27 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
28 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
29 data Similar a b = Similar a (a -> b) b |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
30 data Similar a a = Similar a (a -> a) a |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
32 |
67 | 33 * 型変数をどう扱うかで悩み中です |
34 | |
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
35 # Usage : Similar Monad |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
36 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
37 initObj = Similar 100 id 100 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
38 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
39 initObj >>= \x -> Similar x f (g x) >>= ... |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
40 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
41 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
42 f と g の diff があったら >>= の時点で怒って欲しい |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
43 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
44 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
45 # Similar Monad as Functor |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
46 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
47 data Similar a b = Similar a (a -> b) b |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
48 instance Functor (Similar a) where |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
49 fmap g (Similar a f b) = Similar a (g . f) $ g b |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
50 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
51 |
67 | 52 * 型変数が2つだと Functor の定義は楽 |
53 | |
54 # Similar Monad as Functor | |
55 ``` | |
56 instance Monad (Similar a) where | |
57 return x = Similar x id x -- NG | |
58 s >>= f = mu (eqmap f s) | |
59 ``` | |
60 * 型変数が2つだと Monad の return が定義できない | |
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
61 * (Similar a) の a を固定していないと Monad の instance にできない |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
62 * return :: a1 -> Similar a a1 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
63 * を想定されているが、 id なので Similar a a でおかしい |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
64 |
67 | 65 # Sample : Similar Monad as Functor (revision 9) |
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
66 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
67 similar :: (Show b, Eq b) => (a -> b) -> (a -> b) -> a -> b |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
68 similar f g x = same $ Similar x g (f x) |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
69 |
67 | 70 -- samples |
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
71 ok = map (similar twicePlus double) [1..10] |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
72 notOk = map (similar twicePlus plusTwo) [1..10] |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
73 okSpecific = map (similar twicePlus plusTwo) [2] |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
74 ``` |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
75 |
67 | 76 |
77 # Similar Monad as Monad | |
78 ``` | |
79 data Similar a b = Similar a (a -> b) b | |
80 | |
81 instance EqMonad Similar where | |
82 return x = Similar x id x | |
83 s >>= f = mu (eqmap f s) | |
84 ``` | |
85 | |
86 * 型変数が1つなら Monad の定義はできる | |
87 * 通常の Functor だと (a -> b) の b に constraint をかけられない | |
88 | |
89 | |
90 # Similar Monad as Monad | |
91 | |
92 ``` | |
93 class EqFunctor f where | |
94 eqmap :: (Eq a, Eq b) => (a -> b) -> f a -> f b | |
95 | |
96 instance EqFunctor Similar where | |
97 eqmap f s = Similar fs id fs | |
98 where fs = f $ same s | |
99 ``` | |
100 | |
101 * (a -> b) の b が Eq 保証された Functor Class を使えばどうにか | |
102 | |
103 # Sample : Similar Monad as Monad (revision 11) | |
104 ``` | |
105 same $ return 100 >>= (\x -> Similar x twicePlus $ double x) | |
106 200 | |
107 | |
108 same $ return 2 >>= (\x -> Similar x plusTwo $ double x) | |
109 4 | |
110 | |
111 same $ return 100 >>= (\x -> Similar x plusTwo $ double x) | |
112 *** Exception: Prelude.undefined | |
113 ``` | |
114 | |
115 # Problem | |
66
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
116 * type variable が 1つだと |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
117 * Functor で移す先が Eq である保証が無くて怒られる |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
118 * type variable が 2つだと |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
119 * return の型がー |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
120 * とりあえず悩み中です |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
121 |
ecb53fc23f6f
Add slide for seminar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
122 <!-- vim: set filetype=markdown.slide: --> |