Haskell 使用或滥用错误Monad转换器

Haskell 使用或滥用错误Monad转换器,haskell,styles,Haskell,Styles,背景 我正在使用一个由一堆变压器组成的monad,其中一个是error。因此,我的monad实现了MonadError类,并且throwError是一条有效的语句。我只想在满足一定条件时抛出错误。我倾向于做以下几点: if badCondition then throwError "You did a bad, bad thing..." else return () doGoodThings [...] throwErrorWhen :: (MonadError e m) =>

背景

我正在使用一个由一堆变压器组成的monad,其中一个是error。因此,我的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 ()
在研究这一点时,我认为我甚至可以将其概括为以下几点:

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图书馆

问题


只有在满足某些条件时,才有更好/更正确的方法引发错误吗?

控件中有
when
函数。如果布尔值为真,Monad会计算其第二个参数:

when :: Monad m => Bool -> m () -> m ()
所以你得到

throwErrorWhen cond e = when cond (throwError e)  

像往常一样,我去寻找一个具体的解决方案,这时有一个普通的解决方案盯着我的脸。