ちょっとしたコードを書いていて、IO モナドでガード関数を使いたいと思っていました。ただし、IO 用の MonadPlus の定義がないため、IO ランドではガードを使用できません。MabyeT トランスフォーマーを使用して Maybe Monad でガードを使用し、すべての IO アクションを持ち上げる例を見てきましたが、必要がない場合は実際にはそうしたくありません。
私が欲しいものの例は次のとおりです。
handleFlags :: [Flag] -> IO ()
handleFlags flags = do
when (Help `elem` flags) (putStrLn "Usage: program_name options...")
guard (Help `elem` flags)
... do stuff ...
return ()
MonadPlus またはそれ以外の宣言を通じて、IO モナドでガード関数 (または同様のもの) を取得する良い方法があるかどうか疑問に思っていました。あるいは、私のやり方が間違っているのかもしれません。上記の関数でそのヘルプ メッセージを記述するより良い方法はありますか? ありがとう。
(PS if-then-else ステートメントを使用できますが、どういうわけかポイントを無効にしているようです。多くのオプションでは、大量のネストが発生することは言うまでもありません。)