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 * とりあえず悩み中です