使用或滥用Error Monad Transformer

Joh*_*ler 4 styles haskell

背景

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

if badCondition
  then throwError "You did a bad, bad thing..."
  else return ()
doGoodThings
[...]
Run Code Online (Sandbox Code Playgroud)

在看这个时,我想我甚至可以将它概括为以下内容:

throwErrorWhen :: (MonadError e m) => Bool -> e -> m ()
throeErrorWhen cond err = if cond then throwError e else return ()
Run Code Online (Sandbox Code Playgroud)

事实上,这似乎很明显,我很惊讶它不是MonadError库.

问题:

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

Pet*_*ter 13

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

when :: Monad m => Bool -> m () -> m ()
Run Code Online (Sandbox Code Playgroud)

所以,你得到,

throwErrorWhen cond e = when cond (throwError e)  
Run Code Online (Sandbox Code Playgroud)

  • 像往常一样,当有一个普通的人盯着我时,我去寻找一个特定的解决方案. (2认同)