comparison similar.hs @ 19:003b6e58d815

Define Similar as Monad by mu
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Mon, 22 Sep 2014 23:26:51 +0900
parents c77397d0677f
children d4aa70d94352
comparison
equal deleted inserted replaced
18:c77397d0677f 19:003b6e58d815
1 import Control.Applicative 1 import Control.Applicative
2 import Data.Numbers.Primes -- $ cabal install primes 2 import Data.Numbers.Primes -- $ cabal install primes
3 3
4 data Similar a = Single [String] a | Similar [String] a [String] a deriving (Show) 4 data Similar a = Single [String] a | Similar [String] a [String] a deriving (Show)
5 5
6 original :: (Similar a) -> Similar a 6 value :: (Similar a) -> Similar a
7 original (Similar xs x _ _) = Single xs x 7 value (Similar xs x _ _) = Single xs x
8 original s = s 8 value 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
16 9
17 instance (Eq a) => Eq (Similar a) where 10 instance (Eq a) => Eq (Similar a) where
18 s == ss = (original s) == (original ss) 11 s == ss = (value s) == (value ss)
19 12
20 instance Functor Similar where 13 instance Functor Similar where
21 fmap f (Single xs x) = Single xs (f x) 14 fmap f (Single xs x) = Single xs (f x)
22 fmap f (Similar xs x ys y) = Similar xs (f x) ys (f y) 15 fmap f (Similar xs x ys y) = Similar xs (f x) ys (f y)
23 16
24 similarLogAppend :: [String] -> Similar a -> Similar a 17 mu :: Similar (Similar a) -> Similar a
25 similarLogAppend ls (Single xs x) = Single (ls ++ xs) x 18 mu (Single ls (Single lx x)) = Single (ls ++ lx) x
26 similarLogAppend ls (Similar xs x ys y) = Similar (ls ++ xs) x (ls ++ ys) y 19 mu (Single ls (Similar lx x ly y)) = Similar (ls ++ lx) x (ls ++ ly) y
27 20 mu (Similar lx (Single llx x) ly (Single lly y)) = Similar (lx ++ llx) x (ly ++ lly) y
21 mu (Similar lx (Similar llx x _ _) ly (Similar _ _ lly y)) = Similar (lx ++ llx) x (lx ++ lly) y
22 mu _ = error "Invalid Similar"
28 23
29 instance Monad Similar where 24 instance Monad Similar where
30 return = Single [] 25 return = Single []
31 (Single xs x) >>= f = similarLogAppend xs (original (f x)) 26 s >>= f = mu $ fmap f s
32 (Similar xs x ys y) >>= f = mergeSimilar (similarLogAppend xs (original (f x))) (similarLogAppend ys (similar (f y)))
33 27
34 28
35 {- 29 {-
36 30
37 31