Mercurial > hg > Members > atton > delta_monad
diff delta.hs @ 59:46b15f368905
Define bind and mu for Infinite Delta
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 22 Nov 2014 16:03:40 +0900 |
parents | 1229ee398567 |
children | 295e8ed39c0c |
line wrap: on
line diff
--- a/delta.hs Sat Nov 22 12:34:06 2014 +0900 +++ b/delta.hs Sat Nov 22 16:03:40 2014 +0900 @@ -32,10 +32,17 @@ (Delta f df) <*> d@(Mono x) = Delta (f x) (df <*> d) (Delta f df) <*> (Delta x d) = Delta (f x) (df <*> d) +bind :: (Delta a) -> (a -> Delta b) -> (Delta b) +bind (Mono x) f = f x +bind (Delta x d) f = (headDelta (f x)) `deltaAppend` (bind d (tailDelta . f)) + +mu :: (Delta (Delta a)) -> (Delta a) +mu d = bind d id + instance Monad Delta where return x = Mono x - (Mono x) >>= f = f x - (Delta x d) >>= f = (headDelta (f x)) `deltaAppend` (d >>= (tailDelta . f)) + d >>= f = mu $ fmap f d + -- utils