我刚接触Monad Transformer,抱歉问一个简单的问题。
我有一个值val :: MaybeT IO String
和一个函数fn :: String -> IO [String]
。
所以在绑定后,我有 val >>= liftM fn :: MaybeT IO (IO [String])
。如何去掉重复的IO Monad并获取类型为MaybeT IO [String]
的结果?
我刚接触Monad Transformer,抱歉问一个简单的问题。
我有一个值val :: MaybeT IO String
和一个函数fn :: String -> IO [String]
。
所以在绑定后,我有 val >>= liftM fn :: MaybeT IO (IO [String])
。如何去掉重复的IO Monad并获取类型为MaybeT IO [String]
的结果?
使用lift
(或liftIO
)代替liftM
。
> :t val >>= lift . fn
val >>= lift . fn :: MaybeT IO [String]
liftM
是用于在单子中应用纯函数的。而lift
和 liftIO
则是将动作提升到变换器中使用。
liftM :: Monad m => (a -> b) -> m a -> m b
lift :: (Monad m, MonadTrans t) => m a -> t m a
liftIO :: MonadIO m => IO a -> m a