comparison similar.hs @ 13:88d6897c391a

Redefine Similar. reject function in data
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Sat, 06 Sep 2014 11:03:34 +0900
parents 158ae705cd16
children 116131b196bb
comparison
equal deleted inserted replaced
12:158ae705cd16 13:88d6897c391a
1 {-# LANGUAGE GADTs #-} 1 data Similar a = Single a | Similar a (Similar a)
2 2
3 data Similar a = (Eq a) => Similar a (a -> a) a 3 same :: (Eq a) => Similar a -> a
4 same (Single x) = x
5 same (Similar x s) = if x == (same s) then x else undefined
4 6
5 instance (Eq a) => Eq (Similar a) where 7 instance (Eq a) => Eq (Similar a) where
6 s == ss = same s == same ss 8 s == ss = (same s) == (same ss)
7 9
8 same :: (Eq a) => Similar a -> a 10 instance Functor Similar where
9 same (Similar x f y) = if (f x) == y then y else undefined 11 fmap f (Single a) = Single (f a)
12 fmap f (Similar a s) = Similar (f a) (fmap f s)
13
14 {-
10 15
11 mu :: (Eq a) => Similar (Similar a) -> Similar a 16 mu :: (Eq a) => Similar (Similar a) -> Similar a
12 mu (Similar a f b) = if ((f a) == b) then b else undefined 17 mu (Similar a f b) = if ((f a) == b) then b else undefined
13
14 class EqFunctor f where
15 eqmap :: (Eq a, Eq b) => (a -> b) -> f a -> f b
16
17 instance EqFunctor Similar where
18 eqmap f s = Similar fs id fs
19 where fs = f $ same s
20
21 class EqMonad m where
22 (>>=) :: (Eq a, Eq b) => m a -> (a -> m b) -> m b
23 return ::(Eq a) => a -> m a
24
25 instance EqMonad Similar where
26 return x = Similar x id x
27 s >>= f = mu (eqmap f s)
28 18
29 similar :: (Eq a) => (a -> a) -> (a -> a) -> a -> a 19 similar :: (Eq a) => (a -> a) -> (a -> a) -> a -> a
30 similar f g x = same $ Similar x g (f x) 20 similar f g x = same $ Similar x g (f x)
31 21
32 22
51 41
52 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x plusTwo $ double x) 42 *Main> same $ Main.return 100 Main.>>= (\x -> Similar x plusTwo $ double x)
53 *** Exception: Prelude.undefined 43 *** Exception: Prelude.undefined
54 -} 44 -}
55 45
46 -}