def lift(self, func):
        """Map function over monadic value.

        Takes a function and a monadic value and maps the function over the
        monadic value

        Haskell: liftM :: (Monad m) => (a -> b) -> m a -> m b

        This is really the same function as Functor.fmap, but is instead
        implemented using bind, and does not rely on us inheriting from
        Functor.
        """

        return self.bind(lambda x: self.unit(func(x)))
Map function over monadic value.

        Takes a function and a monadic value and maps the function over the
        monadic value

        Haskell: liftM :: (Monad m) => (a -> b) -> m a -> m b

        This is really the same function as Functor.fmap, but is instead
        implemented using bind, and does not rely on us inheriting from
        Functor.