Haskell中RIO-Prelude的guard能否自定义Either失败时的Left消息?
关于RIO-Prelude中guard函数自定义Either错误消息的问题
默认的guard函数不支持自定义Either monad失败时Left中的错误消息。原因在于guard依赖Alternative类型类的empty实现,而Either String的empty会调用MonadFail的fail方法,该方法固定返回Left "user error"(或类似默认错误文本),无法传入自定义消息。
替代解决方案
1. 自定义带错误消息的guard函数
你可以自己实现一个支持自定义错误的版本,适配所有实现MonadError的monad(包括Either):
import Control.Monad.Except (MonadError(throwError)) guardMsg :: MonadError e m => Bool -> e -> m () guardMsg True _ = pure () guardMsg False err = throwError err
在你的示例中使用:
somefun :: Either String Int somefun = do guardMsg (4+2 == 8) "4+2不等于8,条件不满足" return 2
2. 直接使用when配合错误构造
如果不想额外定义函数,也可以用when直接处理,同样能避免嵌套if:
import Control.Monad (when) somefun :: Either String Int somefun = do when (4+2 /= 8) $ Left "4+2不等于8,条件不满足" return 2
内容的提问来源于stack exchange,提问作者Piskator
相关产品推荐
相关产品推荐

