gpt4 book ai didi

haskell - 在 Haskeline 中的 InputT monad 中执行简单 IO,而不必求助于 unsafePerformIO

转载 作者:行者123 更新时间:2023-12-02 16:46:43 26 4
gpt4 key购买 nike

鉴于下面的概念验证代码,我希望能够以某种方式执行我的 foo 函数,并能够输出字符串 Paul! 以及以下可能性:在 InputT monad-transformer 中获取其返回值,而无需在 runExceptT 之后使用 unsafePerformIO 删除 IO 包装器。

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!"

我在这里遗漏了一些明显的东西吗?

最佳答案

由于 InputT IO 是一个 MonadIO,因此您可以使用以下类型的 liftIO:

liftIO :: IO a -> InputT IO a

所以,

do ...
x <- liftIO $ runExceptT $ foo input
case x of
Left err -> ...
Right res -> ...

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

关于haskell - 在 Haskeline 中的 InputT monad 中执行简单 IO,而不必求助于 unsafePerformIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28053526/

26 4 0
文章推荐: webpack - 如何使用 vue-cli 初始化项目后添加 Karma+Mocha 测试
文章推荐: javascript - 将
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com