我如何编写一个函数,Left x以便出现 IO 错误但Right x像往常一样返回其结果,即该函数具有签名Either [Char] a -> IO a?
基本上我希望Left err结果成为errIO Monad 中的结果。
我如何编写一个函数,Left x以便出现 IO 错误但Right x像往常一样返回其结果,即该函数具有签名Either [Char] a -> IO a?
基本上我希望Left err结果成为errIO 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