Mercurial > hg > Members > atton > delta_monad
annotate haskell/Delta.hs @ 143:f241d521bf65
Merge
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 25 Feb 2015 14:36:02 +0900 |
parents | 3f48bd08865f 3bbb68f0a1e3 |
children |
rev | line source |
---|---|
134
3f48bd08865f
Rename and split with module for haskell codes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
1 module Delta ( Delta(..) , deltaAppend , headDelta , tailDelta , deltaFromList) where |
3f48bd08865f
Rename and split with module for haskell codes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
2 |
17
279ebcf670c4
Define Similar as Applicative
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
3 import Control.Applicative |
134
3f48bd08865f
Rename and split with module for haskell codes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
4 |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
5 |
85 | 6 -- Delta definition |
58 | 7 |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
8 data Delta a = Mono a | Delta a (Delta a) deriving Show |
17
279ebcf670c4
Define Similar as Applicative
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
9 |
73
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
10 instance (Eq a) => Eq (Delta a) where |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
11 (Mono x) == (Mono y) = x == y |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
12 (Mono _) == (Delta _ _) = False |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
13 (Delta x xs) == (Delta y ys) = (x == y) && (xs == ys) |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
14 |
58 | 15 -- basic functions |
16 | |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
17 deltaAppend :: Delta a -> Delta a -> Delta a |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
18 deltaAppend (Mono x) d = Delta x d |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
19 deltaAppend (Delta x d) ds = Delta x (deltaAppend d ds) |
47
1aefea69f71b
Implement bubble sort by delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
46
diff
changeset
|
20 |
69
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
21 headDelta :: Delta a -> a |
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
22 headDelta (Mono x) = x |
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
23 headDelta (Delta x _) = x |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
24 |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
25 tailDelta :: Delta a -> Delta a |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
26 tailDelta d@(Mono _) = d |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
27 tailDelta (Delta _ ds) = ds |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
28 |
58 | 29 -- instance definitions |
30 | |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
31 instance Functor Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
32 fmap f (Mono x) = Mono (f x) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
33 fmap f (Delta x d) = Delta (f x) (fmap f d) |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
34 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
35 instance Applicative Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
36 pure f = Mono f |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
37 (Mono f) <*> (Mono x) = Mono (f x) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
38 df@(Mono f) <*> (Delta x d) = Delta (f x) (df <*> d) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
39 (Delta f df) <*> d@(Mono x) = Delta (f x) (df <*> d) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
40 (Delta f df) <*> (Delta x d) = Delta (f x) (df <*> d) |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
41 |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
42 bind :: (Delta a) -> (a -> Delta b) -> (Delta b) |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
43 bind (Mono x) f = f x |
69
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
44 bind (Delta x d) f = Delta (headDelta (f x)) (bind d (tailDelta . f)) |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
45 |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
46 mu :: (Delta (Delta a)) -> (Delta a) |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
47 mu d = bind d id |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
48 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
49 instance Monad Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
50 return x = Mono x |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
51 d >>= f = mu $ fmap f d |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
52 |
58 | 53 -- utils |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
54 |
58 | 55 deltaFromList :: [a] -> Delta a |
56 deltaFromList = (foldl1 deltaAppend) . (fmap return) |