我使用MongoDB库来处理来自Mongodb的数据。有一个称为Action
的Monad表示DB读取或写入操作https://github.com/TonyGen/mongoDB-haskell/blob/master/doc/tutorial.md
。 但是,我发现当我在monad Action中时,我也想做一些必须在IO Monad中的IO。像如何在另一个Monad中使用IO Monad
-- `Action' is a Monad
--
intoFile :: String -> Cursor -> Action IO()
intoFile ric c = do
outH <- liftIO $ openFile ric AppendMode
liftIO $ hPutStrLn outH "Some log"
loopIntoFile outH c
liftIO $ hClose outH
一些代码有任何IO
单子前liftIO
,我想这可能是冗长。任何简洁的方式来处理这个?
有ISN 'IO'操作完全是作为返回'IO a'而不是'MonadIO m => ma'来实现的,所以不是一个好办法。我经常在函数中看到'where io = liftIO'这样的东西,并且使用函数'io'代替'liftIO',只是为了减少输入。理想情况下,我们有'hPutStrLn :: MonadIO m => Handle - > String - > m()',但是我们不能期望'base'的函数依赖于第三方库中定义的类(即使这些库是haskell平台的一部分)。 – bheklilr 2015-04-02 14:03:57
如果你有一系列的IO动作,你可以改变'do liftIO action1; liftIO action2'到'liftIO $做action1; action2'来保存一些电梯。 – chi 2015-04-02 14:26:00