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