comparison similar.hs @ 15:c599d2236d19

Similar as Monad
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Sat, 06 Sep 2014 16:01:27 +0900
parents 116131b196bb
children 4b315cf0edb9
comparison
equal deleted inserted replaced
14:116131b196bb 15:c599d2236d19
5 5
6 same :: (Eq a) => Similar a -> a 6 same :: (Eq a) => Similar a -> a
7 same (Single x) = x 7 same (Single x) = x
8 same (Similar x s) = if x == (same s) then x else (error "same") 8 same (Similar x s) = if x == (same s) then x else (error "same")
9 9
10 value :: Similar a -> a
11 value (Single x) = x
12 value (Similar x s) = value s
13
14 toList :: Similar a -> [a]
15 toList (Single x) = [x]
16 toList (Similar x s) = x : (toList s)
17
18 toSimilar :: [a] -> Similar a
19 toSimilar [] = undefined
20 toSimilar (x:[]) = Single x
21 toSimilar (x:xs) = Similar x (toSimilar xs)
10 22
11 instance Functor Similar where 23 instance Functor Similar where
12 fmap f (Single a) = Single (f a) 24 fmap f (Single a) = Single (f a)
13 fmap f (Similar a s) = Similar (f a) (fmap f s) 25 fmap f (Similar a s) = Similar (f a) (fmap f s)
14 26
15 mu :: (Eq a) => (Similar (Similar a)) -> Similar a 27 mu :: (Similar (Similar a)) -> Similar a
16 mu (Single x) = x 28 mu s = toSimilar $ concat $ toList $ fmap (toList) s
17 mu (Similar (Single x) s) = Similar x (mu s)
18 mu (Similar s ss) = Similar (same s) (mu ss)
19 29
20 {-
21 instance Monad Similar where 30 instance Monad Similar where
22 return = Single 31 return = Single
23 (Single x) >>= f = f x 32 (Single x) >>= f = f x
24 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s) 33 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s)
25 -}
26 34
27 35
28 36
29 double :: Int -> Similar Int 37 double :: Int -> Similar Int
30 double x = Single (2 * x) 38 double x = Single (2 * x)
36 plusTwo x = Similar (x + 2) (double x) 44 plusTwo x = Similar (x + 2) (double x)
37 45
38 -- samples 46 -- samples
39 47
40 {- 48 {-
41 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x twicePlus $ double x) 49 - Similar as Functor
42 200 50 *Main> fmap (double ) (Single 1)
51 Single (Single 2)
52 *Main> fmap (twicePlus) (Single 1)
53 Single (Similar 2 (Single 2))
54 *Main> fmap (plusTwo) (Single 1)
55 Single (Similar 3 (Single 2))
56 *Main> fmap (fmap double) (fmap (plusTwo ) (Single 1))
57 Single (Similar (Single 6) (Single (Single 4)))
58 *Main> same $ fmap same $ fmap (fmap double) (fmap (plusTwo ) (Single 1))
59 *** Exception: same
60 *Main> same $ fmap same $ fmap (fmap double) (fmap (plusTwo ) (Single 2))
61 Single 8
43 62
44 *Main> same $ Main.return 2 Main.>>= (\x -> Similar x plusTwo $ double x) 63 - Similar as Monad
45 4 64 *Main> return 100 >>= double >>= twicePlus
65 Similar 400 (Single 400)
66 *Main> return 100 >>= double >>= twicePlus >>= plusTwo
67 Similar 402 (Similar 800 (Similar 402 (Single 800)))
46 68
47 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x plusTwo $ double x) 69 *Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo
48 *** Exception: Prelude.undefined 70 *** Exception: same
71 *Main> same $ return 100 >>= double >>= twicePlus
72 400
73
74 *Main> same $ return 100 >>= double >>= twicePlus
75 400
76 *Main> same $ return 100 >>= double >>= twicePlus >>= plusTwo
77 *** Exception: same
78 *Main> value $ return 100 >>= double >>= twicePlus >>= plusTwo
79 800
80
49 -} 81 -}
50 82