Mercurial > hg > Members > atton > delta_monad
comparison delta.hs @ 99:0580e1642477
Change monad definition on DeltaM. use mu.
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 23 Jan 2015 17:05:08 +0900 |
parents | bcd4fe52a504 |
children | 29c54b0197fb |
comparison
equal
deleted
inserted
replaced
98:b7f0879e854e | 99:0580e1642477 |
---|---|
94 | 94 |
95 | 95 |
96 -- DeltaM utils | 96 -- DeltaM utils |
97 | 97 |
98 headDeltaM :: DeltaM m a -> m a | 98 headDeltaM :: DeltaM m a -> m a |
99 headDeltaM (DeltaM (Mono x)) = x | 99 headDeltaM (DeltaM d) = headDelta d |
100 headDeltaM (DeltaM (Delta x _ )) = x | |
101 | 100 |
102 tailDeltaM :: DeltaM m a -> DeltaM m a | 101 tailDeltaM :: DeltaM m a -> DeltaM m a |
103 tailDeltaM d@(DeltaM (Mono _)) = d | 102 tailDeltaM (DeltaM d) = DeltaM $ tailDelta d |
104 tailDeltaM (DeltaM (Delta _ d)) = DeltaM d | |
105 | 103 |
106 appendDeltaM :: DeltaM m a -> DeltaM m a -> DeltaM m a | 104 appendDeltaM :: DeltaM m a -> DeltaM m a -> DeltaM m a |
107 appendDeltaM (DeltaM d) (DeltaM dd) = DeltaM (deltaAppend d dd) | 105 appendDeltaM (DeltaM d) (DeltaM dd) = DeltaM (deltaAppend d dd) |
108 | 106 |
109 checkOut :: Int -> DeltaM m a -> m a | 107 checkOut :: Int -> DeltaM m a -> m a |
123 (DeltaM (Mono f)) <*> (DeltaM (Mono x)) = DeltaM $ Mono $ f <*> x | 121 (DeltaM (Mono f)) <*> (DeltaM (Mono x)) = DeltaM $ Mono $ f <*> x |
124 df@(DeltaM (Mono f)) <*> (DeltaM (Delta x d)) = appendDeltaM (DeltaM $ Mono $ f <*> x) (df <*> (DeltaM d)) | 122 df@(DeltaM (Mono f)) <*> (DeltaM (Delta x d)) = appendDeltaM (DeltaM $ Mono $ f <*> x) (df <*> (DeltaM d)) |
125 (DeltaM (Delta f df)) <*> dx@(DeltaM (Mono x)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> dx) | 123 (DeltaM (Delta f df)) <*> dx@(DeltaM (Mono x)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> dx) |
126 (DeltaM (Delta f df)) <*> (DeltaM (Delta x dx)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> (DeltaM dx)) | 124 (DeltaM (Delta f df)) <*> (DeltaM (Delta x dx)) = appendDeltaM (DeltaM $ Mono $ f <*> x) ((DeltaM df) <*> (DeltaM dx)) |
127 | 125 |
128 instance (Monad m) => Monad (DeltaM m) where | 126 |
129 return x = DeltaM $ Mono $ return x | 127 mu' :: (Functor m, Monad m) => DeltaM m (DeltaM m a) -> DeltaM m a |
130 (DeltaM (Mono x)) >>= f = DeltaM $ Mono $ (x >>= headDeltaM . f) | 128 mu' (DeltaM (Mono x)) = DeltaM $ Mono $ x >>= headDeltaM |
131 (DeltaM (Delta x d)) >>= f = appendDeltaM (DeltaM $ Mono $ (x >>= (headDeltaM . f))) | 129 mu' (DeltaM (Delta x d)) = appendDeltaM (DeltaM $ Mono $ x >>= headDeltaM) |
132 ((DeltaM d) >>= tailDeltaM . f) | 130 (mu' $ fmap tailDeltaM $ DeltaM d ) |
131 | |
132 instance (Functor m, Monad m) => Monad (DeltaM m) where | |
133 return x = DeltaM $ Mono $ return x | |
134 d >>= f = mu' $ fmap f d | |
135 | |
133 | 136 |
134 | 137 |
135 -- DeltaM examples | 138 -- DeltaM examples |
136 | 139 |
137 -- DeltaM example utils | 140 -- DeltaM example utils |
142 returnW x = do tell $ [show x] | 145 returnW x = do tell $ [show x] |
143 return x | 146 return x |
144 | 147 |
145 dmap :: (m a -> b) -> DeltaM m a -> Delta b | 148 dmap :: (m a -> b) -> DeltaM m a -> Delta b |
146 dmap f (DeltaM d) = fmap f d | 149 dmap f (DeltaM d) = fmap f d |
150 | |
151 deltaWithLogFromList :: (Show a) => [a] -> DeltaWithLog a | |
152 deltaWithLogFromList xs = DeltaM $ deltaFromList $ fmap returnW xs | |
147 | 153 |
148 | 154 |
149 -- example : prime filter | 155 -- example : prime filter |
150 -- usage : runWriter $ checkOut 0 $ primeCountM 30 -- run specific version | 156 -- usage : runWriter $ checkOut 0 $ primeCountM 30 -- run specific version |
151 -- : dmap runWriter $ primeCountM 30 -- run all version | 157 -- : dmap runWriter $ primeCountM 30 -- run all version |