我如何编写一个函数,Left x
以便出现 IO 错误但Right x
像往常一样返回其结果,即该函数具有签名Either [Char] a -> IO a
?
基本上我希望Left err
结果成为err
IO Monad 中的结果。
我如何编写一个函数,Left x
以便出现 IO 错误但Right x
像往常一样返回其结果,即该函数具有签名Either [Char] a -> IO a
?
基本上我希望Left err
结果成为err
IO Monad 中的结果。
一个简单的定义是:
f :: Either String a -> IO a
f = either (ioError . userError) return
请注意,我们可以用 来通用fail
,但这实际上是一个历史事故fail
,Monad
所以我不会使用这个定义:
f :: Monad m => Either String a -> m a
f = either fail return
更好的通用版本可能会使用MonadError
该类:
import Control.Monad.Error.Class
f :: MonadError e m => Either String a -> m a
f = either (throwError . strMsg) return