要么[Char] a - > IO一个功能

时间:2013-04-09 17:36:34

标签: haskell

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

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

1 个答案:

答案 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