背景
我正在使用由一堆变压器构建的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)