Mercurial > hg > Members > atton > delta_monad
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 |