我有一个返回类型ErrorT String IO ()的函数。在该功能正常工作时,liftIO会执行IO的每一行都乱七八糟。一团糟。有什么办法可以解决这个问题,并且仍然能够因错误中止?

最佳答案

我假设this is the context of the question,所以我会重新发布我在那儿留下的评论,以防万一您没有注意到它:

如果您经常使用一些特定功能,则可以在它们周围编写包装器,例如liftedPutStr = liftIO . putStr。如果需要,您甚至可以导入合格的原件,并让您的提升版本使用相同的名称。同样,可以将一组不会引发错误的IO动作拉出到一个单独的函数中,然后只需liftIO d次即可。有帮助吗?

如果您不熟悉合格的导入,请再次以putStr为例:

import Prelude hiding (putStr)
import qualified Prelude as P
import Control.Monad.Trans

putStr x = liftIO $ P.putStr x


这样一来,您就可以像平常在putStr中使用真实的IO一样,在转换后的putStr中使用更改后的IO

10-07 15:05