2

我如何编写一个函数,Left x以便出现 IO 错误但Right x像往常一样返回其结果,即该函数具有签名Either [Char] a -> IO a

基本上我希望Left err结果成为errIO Monad 中的结果。

4

1 回答 1

14

一个简单的定义是:

f :: Either String a -> IO a
f = either (ioError . userError) return

请注意,我们可以用 来通用fail,但这实际上是一个历史事故failMonad所以我不会使用这个定义:

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
于 2013-04-09T17:40:03.857 回答