我正在尝试实施:
alert('ok')
它会出现编译错误:
instance MonadTrans MaybeT where
lift m = m >>= \a -> MaybeT $ return (Just a)
我无法理解我犯了什么错误。 请帮帮我;)
答案 0 :(得分:3)
如果您将invigilation
类型lift
专门设为您的MaybeT
类型:
newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) }
lift :: Monad m => m a -> MaybeT m a
>>=
的类型为Monad m => m a -> (a -> m b) -> m b
,因此在您的实施中:
lift m = m >>= \a -> MaybeT $ return (Just a)
当您返回m b
类型的值时,需要返回MaybeT m b
类型的值,因此会出错。
你现在有两个问题。首先,您需要将MaybeT
的应用程序移到>>=
的应用程序之外。第二个是你需要从传递给m (Maybe a)
的lamba构造一个>>=
的值,即
lift x = MaybeT $ x >>= \a -> return (Just a)
或简单地说:
lift x = MaybeT $ fmap Just x