4

背景

我正在使用由一堆变压器组成的单子,其中一个是 ErrorT。因此,我的 monad 实现了MonadError该类并且throwError是一个有效的语句。我只想在满足特定条件时抛出错误。我倾向于做以下事情:

if badCondition
  then throwError "You did a bad, bad thing..."
  else return ()
doGoodThings
[...]

在看这个时,我认为我什至可以将其概括为以下内容:

throwErrorWhen :: (MonadError e m) => Bool -> e -> m ()
throeErrorWhen cond err = if cond then throwError e else return ()

事实上,这似乎很明显,以至于我很惊讶它不是 MonadError 库。

问题

只有满足某些条件,是否有更好/更正确的方法来引发错误?

4

1 回答 1

13

如果布尔值为真,则该when函数会评估其第二个参数:Control.Monad

when :: Monad m => Bool -> m () -> m ()

所以你得到,

throwErrorWhen cond e = when cond (throwError e)  
于 2012-06-18T04:55:25.887 回答