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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
5 -- Delta definition
58
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
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
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
14 -- basic functions
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
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
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
28 -- instance definitions
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
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
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
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
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
57 deltaFromList :: [a] -> Delta a
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
58 deltaFromList = (foldl1 deltaAppend) . (fmap return)
1229ee398567 Mini fixes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
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
5e367a167382 Define samples
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
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
c599d2236d19 Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
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
8d9c55bac8b2 Fix typo
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
84 maximumValue = maximum xs
8d9c55bac8b2 Fix typo
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
85 sortedValueL = maximumValue
8d9c55bac8b2 Fix typo
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
86 sortedValueR = replicate (length $ filter (== maximumValue) xs) maximumValue
8d9c55bac8b2 Fix typo
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
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
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
89
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
90
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
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
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
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
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
160 generatorM x = let intList = [1..x] in
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
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
a1723b3ea997 Mini refactors
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents: 84
diff changeset
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