Haskell Functor laws for Maybe

data Mabye a = Nothing | Just a class Functor f where fmap::(a -> b) -> f a -> f b -- fmap f box -> box instance of Functor need to satisfy two laws. instance Functor Maybe where fmap f Nothing = Nothing -- f is function, it is NOT a functor fmap f (Just a) = Just (f a) -- Show Functor Maybe satisfies the two laws: fmap id = id fmap (f . g) = (fmap f) . (fmap g) Proof: fmap id Nothing = Nothing -- by defintion id Nothing = Nothing -- by definition of identity function => fmap id Nothing = id Nothing (1) fmap id (Just a) = Just a -- by defintion of fmap id (Just a) = Just a -- by defintion of identity function fmap id (Just a) = id (Just a) = Just a => fmap id (Just a) = id (Just a) (2) (1)(2) => fmap id = id [1] fmap (f . g) (Just a) = Just ((f . g) a) -- by defintion of fmap = Just (f(g a)) -- by function composition ((fmap f) . (fmap g)) (Just a) = (fmap f) ( fmap g (Just a)) = (fmap f) (Just (g a)) -- defintion of fmap = Just f(g a) -- defintion of fmap => fmap (f . g) (Just a) = (fmap f) . (fmap g) (Just a) [2] [1],[2] => Maybe is a Functor

Prove MyMaybe is NOT a Functor

data MyMaybe a = MyNothing | MyJust Int a deriving (Show) instance Functor MyMaybe where fmap f MyNothing = MyNothing fmap f (MyJust c a) = (MyJust (c + 1) (f a) print $ MyNothing -- MyNothing print $ fmap (+1) (MyJust 0 2) -- MyJust 1 3 print $ fmap id (MyJust 0 2) -- MyJust 1 2 print $ id (MyJust 0 2) -- MyJust 0 2 -- we have fmap id (MyJust 0 2) /= id (MyJust 0 2) => fmap id /= id -- Functor has to satisfy two laws: fmap id = id [1] fmap (f . g) = (fmap f) . (fmap g) [2] => MyMaybe breaks the first law [1] => MyMaybe is NOT a Functor