Mercurial > hg > Members > atton > delta_monad
annotate delta.hs @ 116:f02c5ad4a327
Prove association-law for DeltaM by (S O) pattern with definition changes
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 01 Feb 2015 17:55:39 +0900 |
parents | 29c54b0197fb |
children | f2187ad63791 |
rev | line source |
---|---|
17
279ebcf670c4
Define Similar as Applicative
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
1 import Control.Applicative |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
2 import Control.Monad.Writer |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
3 import Data.Numbers.Primes -- $ cabal install primes |
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
4 |
85 | 5 -- Delta definition |
58 | 6 |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
7 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
|
8 |
73
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
9 instance (Eq a) => Eq (Delta a) where |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
10 (Mono x) == (Mono y) = x == y |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
11 (Mono _) == (Delta _ _) = False |
0ad0ae7a3cbe
Proving monad-law-1
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
69
diff
changeset
|
12 (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
|
13 |
58 | 14 -- basic functions |
15 | |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
16 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
|
17 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
|
18 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
|
19 |
69
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
20 headDelta :: Delta a -> a |
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
21 headDelta (Mono x) = x |
295e8ed39c0c
Change headDelta definition. return non-delta value
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
59
diff
changeset
|
22 headDelta (Delta x _) = x |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
23 |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
24 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
|
25 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
|
26 tailDelta (Delta _ ds) = ds |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
27 |
58 | 28 -- instance definitions |
29 | |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
30 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
|
31 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
|
32 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
|
33 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
34 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
|
35 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
|
36 (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
|
37 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
|
38 (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
|
39 (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
|
40 |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
41 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
|
42 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
|
43 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
|
44 |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
45 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
|
46 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
|
47 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
48 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
|
49 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
|
50 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
|
51 |
58 | 52 -- utils |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
53 |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
54 returnDD :: (Show s) => s -> s -> Delta s |
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
55 returnDD x y = (return x) `deltaAppend` (return y) |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
56 |
58 | 57 deltaFromList :: [a] -> Delta a |
58 deltaFromList = (foldl1 deltaAppend) . (fmap return) | |
59 | |
23
b4d3960af901
Define similar constructor for different element
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
60 |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
61 -- samples |
3
3c5fbce357af
Define >>= for Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
62 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
63 generator :: Int -> Delta [Int] |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
64 generator x = let intList = [1..x] in |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
65 return intList |
6 | 66 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
67 primeFilter :: [Int] -> Delta [Int] |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
68 primeFilter xs = let primeList = filter isPrime xs |
23
b4d3960af901
Define similar constructor for different element
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
69 refactorList = filter even xs in |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
70 returnDD primeList refactorList |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
71 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
72 count :: [Int] -> Delta Int |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
73 count xs = let primeCount = length xs in |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
74 return primeCount |
15 | 75 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
76 primeCount :: Int -> Delta Int |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
77 primeCount x = generator x >>= primeFilter >>= count |
46
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
78 |
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
79 bubbleSort :: [Int] -> Delta [Int] |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
80 bubbleSort [] = return [] |
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
81 bubbleSort xs = bubbleSort remainValue >>= (\xs -> returnDD (sortedValueL : xs) |
49
d654fdecdcd0
Wrote bubble sort with modified calculate
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
48
diff
changeset
|
82 (sortedValueR ++ xs)) |
46
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
83 where |
51 | 84 maximumValue = maximum xs |
85 sortedValueL = maximumValue | |
86 sortedValueR = replicate (length $ filter (== maximumValue) xs) maximumValue | |
87 remainValue = filter (/= maximumValue) xs | |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
88 |
85 | 89 |
90 | |
91 -- DeltaM definition (Delta with Monad) | |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
92 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
93 data DeltaM m a = DeltaM (Delta (m a)) deriving (Show) |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
94 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
95 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
96 -- DeltaM utils |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
97 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
98 headDeltaM :: DeltaM m a -> m a |
99
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
99 headDeltaM (DeltaM d) = headDelta d |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
100 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
101 tailDeltaM :: DeltaM m a -> DeltaM m a |
99
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
102 tailDeltaM (DeltaM d) = DeltaM $ tailDelta d |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
103 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
104 appendDeltaM :: DeltaM m a -> DeltaM m a -> DeltaM m a |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
105 appendDeltaM (DeltaM d) (DeltaM dd) = DeltaM (deltaAppend d dd) |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
106 |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
107 checkOut :: Int -> DeltaM m a -> m a |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
108 checkOut 0 (DeltaM (Mono x)) = x |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
109 checkOut 0 (DeltaM (Delta x _)) = x |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
110 checkOut n (DeltaM (Mono x)) = x |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
111 checkOut n (DeltaM (Delta _ d)) = checkOut (n-1) (DeltaM d) |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
112 |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
113 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
114 -- DeltaM instance definitions |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
115 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
116 instance (Functor m) => Functor (DeltaM m) where |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
117 fmap f (DeltaM d) = DeltaM $ fmap (fmap f) d |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
118 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
119 instance (Applicative m) => Applicative (DeltaM m) where |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
120 pure f = DeltaM $ Mono $ pure f |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
121 (DeltaM (Mono f)) <*> (DeltaM (Mono x)) = DeltaM $ Mono $ f <*> x |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
122 df@(DeltaM (Mono f)) <*> (DeltaM (Delta x d)) = appendDeltaM (DeltaM $ Mono $ f <*> x) (df <*> (DeltaM d)) |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
123 (DeltaM (Delta f df)) <*> dx@(DeltaM (Mono x)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> dx) |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
124 (DeltaM (Delta f df)) <*> (DeltaM (Delta x dx)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> (DeltaM dx)) |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
125 |
99
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
126 |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
127 mu' :: (Functor m, Monad m) => DeltaM m (DeltaM m a) -> DeltaM m a |
101
29c54b0197fb
Fix bind definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
99
diff
changeset
|
128 mu' (DeltaM (Mono x)) = DeltaM $ Mono $ (>>= id) $ fmap headDeltaM x |
29c54b0197fb
Fix bind definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
99
diff
changeset
|
129 mu' (DeltaM (Delta x d)) = appendDeltaM (mu' $ DeltaM $ Mono x) |
99
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
130 (mu' $ fmap tailDeltaM $ DeltaM d ) |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
131 |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
132 instance (Functor m, Monad m) => Monad (DeltaM m) where |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
133 return x = DeltaM $ Mono $ return x |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
134 d >>= f = mu' $ fmap f d |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
135 |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
136 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
137 |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
138 -- DeltaM examples |
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
139 |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
140 -- DeltaM example utils |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
141 type DeltaLog = Writer [String] |
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
142 type DeltaWithLog = DeltaM DeltaLog |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
143 |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
144 returnW :: (Show a) => a -> DeltaLog a |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
145 returnW x = do tell $ [show x] |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
146 return x |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
147 |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
148 dmap :: (m a -> b) -> DeltaM m a -> Delta b |
85 | 149 dmap f (DeltaM d) = fmap f d |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
150 |
99
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
151 deltaWithLogFromList :: (Show a) => [a] -> DeltaWithLog a |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
152 deltaWithLogFromList xs = DeltaM $ deltaFromList $ fmap returnW xs |
0580e1642477
Change monad definition on DeltaM. use mu.
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
94
diff
changeset
|
153 |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
154 |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
155 -- example : prime filter |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
156 -- usage : runWriter $ checkOut 0 $ primeCountM 30 -- run specific version |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
157 -- : dmap runWriter $ primeCountM 30 -- run all version |
82
1339772b2e36
Define DeltaM. Delta with Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
73
diff
changeset
|
158 |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
159 generatorM :: Int -> DeltaWithLog [Int] |
85 | 160 generatorM x = let intList = [1..x] in |
161 DeltaM $ deltaFromList $ fmap returnW $ replicate 2 intList | |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
162 |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
163 primeFilterM :: [Int] -> DeltaWithLog [Int] |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
164 primeFilterM xs = let primeList = filter isPrime xs |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
165 refactorList = filter even xs in |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
166 DeltaM $ deltaFromList $ fmap returnW [primeList, refactorList] |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
167 |
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
168 |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
169 countM :: [Int] -> DeltaWithLog Int |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
170 countM xs = let primeCount = length xs in |
85 | 171 DeltaM $ deltaFromList $ fmap returnW $ replicate 2 primeCount |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
172 |
84
8c7bd8bf8092
Define DeltaWithLog
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
83
diff
changeset
|
173 primeCountM :: Int -> DeltaWithLog Int |
83
6635a513f81a
Add example for DeltaM
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
82
diff
changeset
|
174 primeCountM x = generatorM x >>= primeFilterM >>= countM |