Mercurial > hg > Members > atton > delta_monad
comparison 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 |
comparison
equal
deleted
inserted
replaced
58:1229ee398567 | 59:46b15f368905 |
---|---|
30 (Mono f) <*> (Mono x) = Mono (f x) | 30 (Mono f) <*> (Mono x) = Mono (f x) |
31 df@(Mono f) <*> (Delta x d) = Delta (f x) (df <*> d) | 31 df@(Mono f) <*> (Delta x d) = Delta (f x) (df <*> d) |
32 (Delta f df) <*> d@(Mono x) = Delta (f x) (df <*> d) | 32 (Delta f df) <*> d@(Mono x) = Delta (f x) (df <*> d) |
33 (Delta f df) <*> (Delta x d) = Delta (f x) (df <*> d) | 33 (Delta f df) <*> (Delta x d) = Delta (f x) (df <*> d) |
34 | 34 |
35 bind :: (Delta a) -> (a -> Delta b) -> (Delta b) | |
36 bind (Mono x) f = f x | |
37 bind (Delta x d) f = (headDelta (f x)) `deltaAppend` (bind d (tailDelta . f)) | |
38 | |
39 mu :: (Delta (Delta a)) -> (Delta a) | |
40 mu d = bind d id | |
41 | |
35 instance Monad Delta where | 42 instance Monad Delta where |
36 return x = Mono x | 43 return x = Mono x |
37 (Mono x) >>= f = f x | 44 d >>= f = mu $ fmap f d |
38 (Delta x d) >>= f = (headDelta (f x)) `deltaAppend` (d >>= (tailDelta . f)) | 45 |
39 | 46 |
40 | 47 |
41 -- utils | 48 -- utils |
42 | 49 |
43 returnS :: (Show s) => s -> Delta s | 50 returnS :: (Show s) => s -> Delta s |