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