Mercurial > hg > Members > atton > seminar_slides
comparison slides/20140902/slide.md @ 67:309850f23a67
Update slide
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 02 Sep 2014 18:03:18 +0900 |
parents | ecb53fc23f6f |
children |
comparison
equal
deleted
inserted
replaced
66:ecb53fc23f6f | 67:309850f23a67 |
---|---|
28 ``` | 28 ``` |
29 data Similar a b = Similar a (a -> b) b | 29 data Similar a b = Similar a (a -> b) b |
30 data Similar a a = Similar a (a -> a) a | 30 data Similar a a = Similar a (a -> a) a |
31 ``` | 31 ``` |
32 | 32 |
33 * 型変数をどう扱うかで悩み中です | |
34 | |
33 # Usage : Similar Monad | 35 # Usage : Similar Monad |
34 ``` | 36 ``` |
35 initObj = Similar 100 id 100 | 37 initObj = Similar 100 id 100 |
36 | 38 |
37 initObj >>= \x -> Similar x f (g x) >>= ... | 39 initObj >>= \x -> Similar x f (g x) >>= ... |
45 data Similar a b = Similar a (a -> b) b | 47 data Similar a b = Similar a (a -> b) b |
46 instance Functor (Similar a) where | 48 instance Functor (Similar a) where |
47 fmap g (Similar a f b) = Similar a (g . f) $ g b | 49 fmap g (Similar a f b) = Similar a (g . f) $ g b |
48 ``` | 50 ``` |
49 | 51 |
50 * こんな感じなんだろうけれど Monad の return が定義できない | 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 が定義できない | |
51 * (Similar a) の a を固定していないと Monad の instance にできない | 61 * (Similar a) の a を固定していないと Monad の instance にできない |
52 * return :: a1 -> Similar a a1 | 62 * return :: a1 -> Similar a a1 |
53 * を想定されているが、 id なので Similar a a でおかしい | 63 * を想定されているが、 id なので Similar a a でおかしい |
54 | 64 |
55 # Sample : Similar Monad as Functor | 65 # Sample : Similar Monad as Functor (revision 9) |
56 ``` | 66 ``` |
57 similar :: (Show b, Eq b) => (a -> b) -> (a -> b) -> a -> b | 67 similar :: (Show b, Eq b) => (a -> b) -> (a -> b) -> a -> b |
58 similar f g x = same $ Similar x g (f x) | 68 similar f g x = same $ Similar x g (f x) |
59 | 69 |
60 -- samples (revision 9) | 70 -- samples |
61 ok = map (similar twicePlus double) [1..10] | 71 ok = map (similar twicePlus double) [1..10] |
62 notOk = map (similar twicePlus plusTwo) [1..10] | 72 notOk = map (similar twicePlus plusTwo) [1..10] |
63 okSpecific = map (similar twicePlus plusTwo) [2] | 73 okSpecific = map (similar twicePlus plusTwo) [2] |
64 ``` | 74 ``` |
65 | 75 |
66 # 謎 | 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 | |
67 * type variable が 1つだと | 116 * type variable が 1つだと |
68 * Functor で移す先が Eq である保証が無くて怒られる | 117 * Functor で移す先が Eq である保証が無くて怒られる |
69 * type variable が 2つだと | 118 * type variable が 2つだと |
70 * return の型がー | 119 * return の型がー |
71 * とりあえず悩み中です | 120 * とりあえず悩み中です |