Mercurial > hg > Members > atton > delta_monad
annotate 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 |
rev | line source |
---|---|
17
279ebcf670c4
Define Similar as Applicative
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
1 import Control.Applicative |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
2 import Data.Numbers.Primes -- $ cabal install primes |
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
3 |
58 | 4 -- delta definition |
5 | |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
6 data Delta a = Mono a | Delta a (Delta a) deriving Show |
17
279ebcf670c4
Define Similar as Applicative
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
16
diff
changeset
|
7 |
58 | 8 -- basic functions |
9 | |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
10 deltaAppend :: Delta a -> Delta a -> Delta a |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
11 deltaAppend (Mono x) d = Delta x d |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
12 deltaAppend (Delta x d) ds = Delta x (deltaAppend d ds) |
47
1aefea69f71b
Implement bubble sort by delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
46
diff
changeset
|
13 |
53
1e6fecb54f1f
Adjust function name
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
52
diff
changeset
|
14 headDelta :: Delta a -> Delta a |
58 | 15 headDelta d@(Mono _) = d |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
16 headDelta (Delta x _) = Mono x |
14
116131b196bb
Define fmap and mu
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
13
diff
changeset
|
17 |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
18 tailDelta :: Delta a -> Delta a |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
19 tailDelta d@(Mono _) = d |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
20 tailDelta (Delta _ ds) = ds |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
21 |
58 | 22 -- instance definitions |
23 | |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
24 instance Functor Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
25 fmap f (Mono x) = Mono (f x) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
26 fmap f (Delta x d) = Delta (f x) (fmap f d) |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
27 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
28 instance Applicative Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
29 pure f = Mono f |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
30 (Mono f) <*> (Mono x) = Mono (f x) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
31 df@(Mono f) <*> (Delta x d) = Delta (f x) (df <*> d) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
32 (Delta f df) <*> d@(Mono x) = Delta (f x) (df <*> d) |
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
33 (Delta f df) <*> (Delta x d) = Delta (f x) (df <*> d) |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
34 |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
35 bind :: (Delta a) -> (a -> Delta b) -> (Delta b) |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
36 bind (Mono x) f = f x |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
37 bind (Delta x d) f = (headDelta (f x)) `deltaAppend` (bind d (tailDelta . f)) |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
38 |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
39 mu :: (Delta (Delta a)) -> (Delta a) |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
40 mu d = bind d id |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
41 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
42 instance Monad Delta where |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
43 return x = Mono x |
59
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
44 d >>= f = mu $ fmap f d |
46b15f368905
Define bind and mu for Infinite Delta
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
58
diff
changeset
|
45 |
58 | 46 |
47 | |
48 -- utils | |
18
c77397d0677f
Try define Similar as Monad
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
17
diff
changeset
|
49 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
50 returnS :: (Show s) => s -> Delta s |
57
dfcd72dc697e
ReDefine Delta used non-empty-list for infinite changes
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
53
diff
changeset
|
51 returnS x = Mono x |
0
7a82a5e50499
Initial commit. define to Functor for Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
52 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
53 returnSS :: (Show s) => s -> s -> Delta s |
52
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
54 returnSS x y = (returnS x) `deltaAppend` (returnS y) |
69a01cc80075
Define Delta for Infinite changes in Haskell
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
51
diff
changeset
|
55 |
58 | 56 deltaFromList :: [a] -> Delta a |
57 deltaFromList = (foldl1 deltaAppend) . (fmap return) | |
58 | |
23
b4d3960af901
Define similar constructor for different element
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
59 |
16
4b315cf0edb9
Improve mu definition
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
15
diff
changeset
|
60 -- samples |
3
3c5fbce357af
Define >>= for Similer
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
2
diff
changeset
|
61 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
62 generator :: Int -> Delta [Int] |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
63 generator x = let intList = [1..x] in |
22
f0400c4c953f
Imporve Similar definition. delete "Single" constructor
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
64 returnS intList |
6 | 65 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
66 primeFilter :: [Int] -> Delta [Int] |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
67 primeFilter xs = let primeList = filter isPrime xs |
23
b4d3960af901
Define similar constructor for different element
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
68 refactorList = filter even xs in |
b4d3960af901
Define similar constructor for different element
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
22
diff
changeset
|
69 returnSS primeList refactorList |
11
e8a5df54480e
Define sample for Monad style
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
10
diff
changeset
|
70 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
71 count :: [Int] -> Delta Int |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
72 count xs = let primeCount = length xs in |
22
f0400c4c953f
Imporve Similar definition. delete "Single" constructor
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
21
diff
changeset
|
73 returnS primeCount |
15 | 74 |
43
90b171e3a73e
Rename to Delta from Similar
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
23
diff
changeset
|
75 primeCount :: Int -> Delta Int |
21
af8754322ed4
Define Similar sample
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
20
diff
changeset
|
76 primeCount x = generator x >>= primeFilter >>= count |
46
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
77 |
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
78 bubbleSort :: [Int] -> Delta [Int] |
48
820af7cc8485
Wrote >>= style bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
47
diff
changeset
|
79 bubbleSort [] = returnS [] |
49
d654fdecdcd0
Wrote bubble sort with modified calculate
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
48
diff
changeset
|
80 bubbleSort xs = bubbleSort remainValue >>= (\xs -> returnSS (sortedValueL : xs) |
d654fdecdcd0
Wrote bubble sort with modified calculate
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
48
diff
changeset
|
81 (sortedValueR ++ xs)) |
46
cb5c190aa45d
Define bubble sort
Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
parents:
45
diff
changeset
|
82 where |
51 | 83 maximumValue = maximum xs |
84 sortedValueL = maximumValue | |
85 sortedValueR = replicate (length $ filter (== maximumValue) xs) maximumValue | |
86 remainValue = filter (/= maximumValue) xs |