Mercurial > hg > Members > atton > delta_monad
annotate similar.hs @ 16:4b315cf0edb9
Improve mu definition
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 09 Sep 2014 13:29:43 +0900 |
parents | c599d2236d19 |
children | 279ebcf670c4 |
rev | line source |
---|---|
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
1 data Similar a = Single a | Similar a (Similar a) deriving (Show) |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
2 |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
3 instance (Eq a) => Eq (Similar a) where |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
4 s == ss = (same s) == (same ss) |
10
7c7efee7891f
Define Monad style Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
5 |
13
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
6 same :: (Eq a) => Similar a -> a |
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
7 same (Single x) = x |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
8 same (Similar x s) = if x == (same s) then x else (error "same") |
10
7c7efee7891f
Define Monad style Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
9 |
15 | 10 value :: Similar a -> a |
11 value (Single x) = x | |
12 value (Similar x s) = value s | |
13 | |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
14 similar :: Similar a -> Similar a -> Similar a |
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
15 similar (Single x) ss = Similar x ss |
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
16 similar (Similar x s) ss = Similar x (similar s ss) |
10
7c7efee7891f
Define Monad style Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
17 |
13
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
18 instance Functor Similar where |
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
19 fmap f (Single a) = Single (f a) |
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
20 fmap f (Similar a s) = Similar (f a) (fmap f s) |
88d6897c391a
Redefine Similar. reject function in data
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
12
diff
changeset
|
21 |
15 | 22 mu :: (Similar (Similar a)) -> Similar a |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
23 mu (Single s) = s |
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
24 mu (Similar s ss) = similar s (mu ss) |
10
7c7efee7891f
Define Monad style Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
25 |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
26 instance Monad Similar where |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
27 return = Single |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
28 (Single x) >>= f = f x |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
29 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s) |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
30 |
0
7a82a5e50499
Initial commit. define to Functor for Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
31 |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
32 -- samples |
3
3c5fbce357af
Define >>= for Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
33 |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
34 double :: Int -> Similar Int |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
35 double x = Single (2 * x) |
4
66609010d477
Define Similer example as Functor
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
36 |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
37 twicePlus :: Int -> Similar Int |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
38 twicePlus x = Similar (x + x) (double x) |
4
66609010d477
Define Similer example as Functor
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
39 |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
40 plusTwo :: Int -> Similar Int |
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
41 plusTwo x = Similar (x + 2) (double x) |
4
66609010d477
Define Similer example as Functor
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
3
diff
changeset
|
42 |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
43 -- samples |
6 | 44 |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
45 {- |
15 | 46 - Similar as Functor |
47 *Main> fmap (double ) (Single 1) | |
48 Single (Single 2) | |
49 *Main> fmap (twicePlus) (Single 1) | |
50 Single (Similar 2 (Single 2)) | |
51 *Main> fmap (plusTwo) (Single 1) | |
52 Single (Similar 3 (Single 2)) | |
53 *Main> fmap (fmap double) (fmap (plusTwo ) (Single 1)) | |
54 Single (Similar (Single 6) (Single (Single 4))) | |
55 *Main> same $ fmap same $ fmap (fmap double) (fmap (plusTwo ) (Single 1)) | |
56 *** Exception: same | |
57 *Main> same $ fmap same $ fmap (fmap double) (fmap (plusTwo ) (Single 2)) | |
58 Single 8 | |
6 | 59 |
15 | 60 - Similar as Monad |
61 *Main> return 100 >>= double >>= twicePlus | |
62 Similar 400 (Single 400) | |
63 *Main> return 100 >>= double >>= twicePlus >>= plusTwo | |
64 Similar 402 (Similar 800 (Similar 402 (Single 800))) | |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
65 |
15 | 66 *Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo |
67 *** Exception: same | |
68 *Main> same $ return 100 >>= double >>= twicePlus | |
69 400 | |
70 | |
71 *Main> same $ return 100 >>= double >>= twicePlus | |
72 400 | |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
73 *Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo |
15 | 74 *** Exception: same |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
75 *Main> value $ return 100 >>= double >>= twicePlus >>= plusTwo |
15 | 76 800 |
77 | |
10
7c7efee7891f
Define Monad style Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
9
diff
changeset
|
78 -} |
12
158ae705cd16
Rename Similer -> Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
11
diff
changeset
|
79 |