comparison similar.hs @ 14:116131b196bb

Define fmap and mu
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Sat, 06 Sep 2014 11:45:32 +0900
parents 88d6897c391a
children c599d2236d19
comparison
equal deleted inserted replaced
13:88d6897c391a 14:116131b196bb
1 data Similar a = Single a | Similar a (Similar a) 1 data Similar a = Single a | Similar a (Similar a) deriving (Show)
2
3 instance (Eq a) => Eq (Similar a) where
4 s == ss = (same s) == (same ss)
2 5
3 same :: (Eq a) => Similar a -> a 6 same :: (Eq a) => Similar a -> a
4 same (Single x) = x 7 same (Single x) = x
5 same (Similar x s) = if x == (same s) then x else undefined 8 same (Similar x s) = if x == (same s) then x else (error "same")
6 9
7 instance (Eq a) => Eq (Similar a) where
8 s == ss = (same s) == (same ss)
9 10
10 instance Functor Similar where 11 instance Functor Similar where
11 fmap f (Single a) = Single (f a) 12 fmap f (Single a) = Single (f a)
12 fmap f (Similar a s) = Similar (f a) (fmap f s) 13 fmap f (Similar a s) = Similar (f a) (fmap f s)
13 14
15 mu :: (Eq a) => (Similar (Similar a)) -> Similar a
16 mu (Single x) = x
17 mu (Similar (Single x) s) = Similar x (mu s)
18 mu (Similar s ss) = Similar (same s) (mu ss)
19
14 {- 20 {-
15 21 instance Monad Similar where
16 mu :: (Eq a) => Similar (Similar a) -> Similar a 22 return = Single
17 mu (Similar a f b) = if ((f a) == b) then b else undefined 23 (Single x) >>= f = f x
18 24 (Similar x s) >>= f = mu $ Similar (f x) (fmap f s)
19 similar :: (Eq a) => (a -> a) -> (a -> a) -> a -> a 25 -}
20 similar f g x = same $ Similar x g (f x)
21 26
22 27
23 28
24 double :: Int -> Int 29 double :: Int -> Similar Int
25 double x = (2 * x) 30 double x = Single (2 * x)
26 31
27 twicePlus :: Int -> Int 32 twicePlus :: Int -> Similar Int
28 twicePlus x = x + x 33 twicePlus x = Similar (x + x) (double x)
29 34
30 plusTwo :: Int -> Int 35 plusTwo :: Int -> Similar Int
31 plusTwo x = x + 2 36 plusTwo x = Similar (x + 2) (double x)
32 37
33 -- samples 38 -- samples
34 39
35 {- 40 {-
36 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x twicePlus $ double x) 41 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x twicePlus $ double x)
41 46
42 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x plusTwo $ double x) 47 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x plusTwo $ double x)
43 *** Exception: Prelude.undefined 48 *** Exception: Prelude.undefined
44 -} 49 -}
45 50
46 -}