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