首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在InputT monad内部,在Haskeline中执行简单的IO,而不必求助于unsafePerformIO

在InputT monad内部,在Haskeline中执行简单的IO,而不必求助于unsafePerformIO
EN

Stack Overflow用户
提问于 2015-01-20 19:22:35
回答 1查看 651关注 0票数 7

给出以下概念代码的证明,我希望能够以某种方式执行我的foo函数,它能够输出字符串Paul!,并且可以在InputT单变压器内部获得其返回值,而无需在runExceptT之后使用unsafePerformIO删除IO包装器。

代码语言:javascript
复制
import Control.Monad.Except

import System.IO.Unsafe (unsafePerformIO)
import System.Console.Haskeline


type ErrorWithIO = ExceptT String IO


foo :: String -> ErrorWithIO String
foo "paul" = do liftIO $ putStrLn "Paul!"
                return "OK!"
foo _ = throwError "ERROR!"


runRepl :: IO ()
runRepl = runInputT defaultSettings $ loop


loop :: InputT IO ()
loop = do
    line <- getInputLine "> "
    case line of
        Nothing -> return ()
        Just input -> do return $ putStrLn "asd"
                         case unsafePerformIO $ runExceptT $ foo input of
                             Left err -> outputStrLn err >> loop
                             Right res -> do
                                 x <- outputStrLn . show $ res
                                 loop




main :: IO ()
main = runRepl >> putStrLn "Goodbye!"

我是不是漏掉了什么明显的东西?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-20 19:33:49

由于InputT IO是一个MonadIO,所以您可以在以下类型中使用liftIO

代码语言:javascript
复制
liftIO :: IO a -> InputT IO a

所以,

代码语言:javascript
复制
do ...
   x <- liftIO $ runExceptT $ foo input
   case x of
     Left err  -> ...
     Right res -> ...

或者,使用Control.Monad.Trans.lift代替。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28053526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档