自己实施的MaybeT lift

时间:2016-04-19 11:46:23

标签: haskell

我正在尝试实施:

alert('ok')

它会出现编译错误:

instance MonadTrans MaybeT where
    lift m = m >>= \a -> MaybeT $ return (Just a)

我无法理解我犯了什么错误。 请帮帮我;)

1 个答案:

答案 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