docs: 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)))