comparison delta.hs @ 69:295e8ed39c0c

Change headDelta definition. return non-delta value
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Thu, 27 Nov 2014 19:12:44 +0900
parents 46b15f368905
children 0ad0ae7a3cbe
comparison
equal deleted inserted replaced
68:f9c9207c40b7 69:295e8ed39c0c
9 9
10 deltaAppend :: Delta a -> Delta a -> Delta a 10 deltaAppend :: Delta a -> Delta a -> Delta a
11 deltaAppend (Mono x) d = Delta x d 11 deltaAppend (Mono x) d = Delta x d
12 deltaAppend (Delta x d) ds = Delta x (deltaAppend d ds) 12 deltaAppend (Delta x d) ds = Delta x (deltaAppend d ds)
13 13
14 headDelta :: Delta a -> Delta a 14 headDelta :: Delta a -> a
15 headDelta d@(Mono _) = d 15 headDelta (Mono x) = x
16 headDelta (Delta x _) = Mono x 16 headDelta (Delta x _) = x
17 17
18 tailDelta :: Delta a -> Delta a 18 tailDelta :: Delta a -> Delta a
19 tailDelta d@(Mono _) = d 19 tailDelta d@(Mono _) = d
20 tailDelta (Delta _ ds) = ds 20 tailDelta (Delta _ ds) = ds
21 21
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) 35 bind :: (Delta a) -> (a -> Delta b) -> (Delta b)
36 bind (Mono x) f = f x 36 bind (Mono x) f = f x
37 bind (Delta x d) f = (headDelta (f x)) `deltaAppend` (bind d (tailDelta . f)) 37 bind (Delta x d) f = Delta (headDelta (f x)) (bind d (tailDelta . f))
38 38
39 mu :: (Delta (Delta a)) -> (Delta a) 39 mu :: (Delta (Delta a)) -> (Delta a)
40 mu d = bind d id 40 mu d = bind d id
41 41
42 instance Monad Delta where 42 instance Monad Delta where