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