如何编写函数以便Left x
发生IO错误但Right x
像往常一样返回结果,即函数有签名Either [Char] a -> IO a
?
基本上我希望Left err
结果成为IO Monad中的err
。
答案 0 :(得分:14)
一个简单的定义是:
f :: Either String a -> IO a
f = either (ioError . userError) return
请注意,我们可以使用fail
制作此通用内容,但fail
开始时Monad
确实是一个历史性事故,因此我不会使用此定义:< / p>
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