# HG changeset patch # User Yasutaka Higa # Date 1410247282 -32400 # Node ID 279ebcf670c4d68006c34a1e77fb252fab2ad023 # Parent 4b315cf0edb97c0fdfa88d368ede29672c7c9903 Define Similar as Applicative diff -r 4b315cf0edb9 -r 279ebcf670c4 similar.hs --- a/similar.hs Tue Sep 09 13:29:43 2014 +0900 +++ b/similar.hs Tue Sep 09 16:21:22 2014 +0900 @@ -1,3 +1,5 @@ +import Control.Applicative + data Similar a = Single a | Similar a (Similar a) deriving (Show) instance (Eq a) => Eq (Similar a) where @@ -19,6 +21,11 @@ fmap f (Single a) = Single (f a) fmap f (Similar a s) = Similar (f a) (fmap f s) +instance Applicative Similar where + pure = Single + (Single f) <*> s = fmap f s + (Similar f s) <*> ss = similar (fmap f ss) (s <*> ss) + mu :: (Similar (Similar a)) -> Similar a mu (Single s) = s mu (Similar s ss) = similar s (mu ss) @@ -57,6 +64,14 @@ *Main> same $ fmap same $ fmap (fmap double) (fmap (plusTwo ) (Single 2)) Single 8 +- Similar as Applicative Functor +*Main> Single (\x -> x * x) <*> Single 100 +Single 10000 +*Main> Similar (\x -> x * x) (Single (\x -> x * 3)) <*> Single 100 +Similar 10000 (Single 300) +*Main> Similar (\x -> x * x) (Single (\x -> x * 3)) <*> (Similar 100 (Single 200)) +Similar 10000 (Similar 40000 (Similar 300 (Single 600))) + - Similar as Monad *Main> return 100 >>= double >>= twicePlus Similar 400 (Single 400)