comparison similar.hs @ 18:c77397d0677f

Try define Similar as Monad
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Mon, 22 Sep 2014 21:04:32 +0900
parents 279ebcf670c4
children 003b6e58d815
comparison
equal deleted inserted replaced
17:279ebcf670c4 18:c77397d0677f
1 import Control.Applicative 1 import Control.Applicative
2 import Data.Numbers.Primes -- $ cabal install primes
2 3
3 data Similar a = Single a | Similar a (Similar a) deriving (Show) 4 data Similar a = Single [String] a | Similar [String] a [String] a deriving (Show)
5
6 original :: (Similar a) -> Similar a
7 original (Similar xs x _ _) = Single xs x
8 original s = s
9
10 similar :: (Similar a) -> Similar a
11 similar (Similar _ _ ys y) = Single ys y
12 similar s = s
13
14 mergeSimilar :: Similar a -> Similar a -> Similar a
15 mergeSimilar (Single xs x) (Single ys y) = Similar xs x ys y
4 16
5 instance (Eq a) => Eq (Similar a) where 17 instance (Eq a) => Eq (Similar a) where
6 s == ss = (same s) == (same ss) 18 s == ss = (original s) == (original ss)
7 19
20 instance Functor Similar where
21 fmap f (Single xs x) = Single xs (f x)
22 fmap f (Similar xs x ys y) = Similar xs (f x) ys (f y)
23
24 similarLogAppend :: [String] -> Similar a -> Similar a
25 similarLogAppend ls (Single xs x) = Single (ls ++ xs) x
26 similarLogAppend ls (Similar xs x ys y) = Similar (ls ++ xs) x (ls ++ ys) y
27
28
29 instance Monad Similar where
30 return = Single []
31 (Single xs x) >>= f = similarLogAppend xs (original (f x))
32 (Similar xs x ys y) >>= f = mergeSimilar (similarLogAppend xs (original (f x))) (similarLogAppend ys (similar (f y)))
33
34
35 {-
36
37
38
39 -- samples
40 {-
41
42 generator :: Int -> Similar [Int]
43 generator x = return [1..x]
44
45 primeFilter :: [Int] -> Similar [Int]
46 primeFilter xs = return $ filter isPrime xs
47
48 count :: [Int] -> Similar Int
49 count xs = return $ length xs
50
51 primeCount :: Int -> Int
52 primeCount x = value $ generator x >>= primeFilter >>= count
53 -}
54
55
56 {-
8 same :: (Eq a) => Similar a -> a 57 same :: (Eq a) => Similar a -> a
9 same (Single x) = x 58 same (Single x) = x
10 same (Similar x s) = if x == (same s) then x else (error "same") 59 same (Similar x s) = if x == (same s) then x else (error "same")
11 60
12 value :: Similar a -> a
13 value (Single x) = x
14 value (Similar x s) = value s
15 61
16 similar :: Similar a -> Similar a -> Similar a 62 similar :: Similar a -> Similar a -> Similar a
17 similar (Single x) ss = Similar x ss 63 similar (Single x) ss = Similar x ss
18 similar (Similar x s) ss = Similar x (similar s ss) 64 similar (Similar x s) ss = Similar x (similar s ss)
19 65
28 74
29 mu :: (Similar (Similar a)) -> Similar a 75 mu :: (Similar (Similar a)) -> Similar a
30 mu (Single s) = s 76 mu (Single s) = s
31 mu (Similar s ss) = similar s (mu ss) 77 mu (Similar s ss) = similar s (mu ss)
32 78
33 instance Monad Similar where
34 return = Single
35 (Single x) >>= f = f x
36 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s)
37 79
38 80
39 -- samples 81 -- samples
40 82
41 double :: Int -> Similar Int 83 double :: Int -> Similar Int
89 *** Exception: same 131 *** Exception: same
90 *Main> value $ return 100 >>= double >>= twicePlus >>= plusTwo 132 *Main> value $ return 100 >>= double >>= twicePlus >>= plusTwo
91 800 133 800
92 134
93 -} 135 -}
94 136 -}
137 -}