module Id where newtype I a = I a unI :: I a -> a unI (I a) = a instance Monad I where return = I (I m) >>= k = k m instance Functor I where fmap f m = do { x <- m; return (f x) } instance Applicative I where pure = return g <*> m = do { f <- g; x <- m; return (f x) }