背景
我正在使用由一堆变换器构建的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库。
问题:
是否有更好/更正确的方法来提出错误只是满足某些条件?
答案 0 :(得分:13)
如果布尔值为真,when
中的Control.Monad
函数会评估其第二个参数:
when :: Monad m => Bool -> m () -> m ()
所以你得到了,
throwErrorWhen cond e = when cond (throwError e)