今天在Coding Dojo工作,我尝试了以下方法
example :: IO ()
example = do input <- getLine
parsed <- parseOnly parser input
...
Run Code Online (Sandbox Code Playgroud)
其中,parseOnly :: Parser a -> Either String a(从attoparsec课程)编译器抱怨说,Either ..没有IO ..实质上是告诉我,我混的单子.
当然这可以通过解决
case parseOnly parser input of .. -> ..
Run Code Online (Sandbox Code Playgroud)
我想,这有点不雅观.另外我的猜测是其他人之前遇到过这个问题而且我认为解决方案与monad变换器有关,但最后一点我不能拼凑在一起.
它也让我想起了liftIO- 但这是另一种方式,我认为这解决了在一些周围的monad中发生IO动作的问题(更确切地说MonadIO- 例如在内部,Snap当一个人想要stdout在获取一些http 时打印一些东西).
更一般的这个问题似乎是针对a Monad m1和a(不同)Monad m2我该怎样做的事情
example = do a <- m1Action
b <- m2Action
..
Run Code Online (Sandbox Code Playgroud)