-- data Maybe (a) where { -- Nothing : Maybe (a) -- Just : a -> Maybe (a) -- }; -- fmap : (a -> b) -> Maybe (a) -> Maybe (b) ; -- fmap f ma = case ma of { -- Nothing => Nothing ; -- Just a => Just (f a) ; -- }; -- pure : a -> Maybe (a) ; -- pure x = Just x ; -- ap mf ma = case mf of { -- Just f => case ma of { -- Nothing => Nothing; -- Just a => Just (f a); -- }; -- Nothing => Nothing; -- }; -- return = pure; -- bind ma f = case ma of { -- Nothing => Nothing ; -- Just a => f a ; -- };