You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:59:53