使用或滥用Error Monad Transformer

时间:2012-06-18 04:43:24

标签: haskell styles

背景

我正在使用由一堆变换器构建的monad,其中一个是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库。

问题

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

1 个答案:

答案 0 :(得分:13)

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

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

所以你得到了,

throwErrorWhen cond e = when cond (throwError e)