4

バックグラウンド

私は、トランスフォーマーのスタックで構築されたモナドを使用しており、そのうちの 1 つは ErrorT です。したがって、私のモナドは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 ライブラリではないことに驚きました。

質問:

何らかの条件が満たされた場合にのみエラーを発生させるより良い/より正しい方法はありますか?

4

1 に答える 1

13

ブール値が true の場合に 2 番目の引数を評価するwhen関数があります。Control.Monad

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

つまり、

throwErrorWhen cond e = when cond (throwError e)  
于 2012-06-18T04:55:25.887 に答える