我刚写了一点代码,想要在IO Monad中使用guard函数。然而,在IO中没有MonadPlus的定义,这意味着我们不能在IO领域使用guard。我看过一个例子,使用MaybeT转换器在Maybe Monad中使用guard并提升所有IO操作,但如果不必要,我不想这样做。
我想要的一些示例可能包括:
handleFlags :: [Flag] -> IO ()
handleFlags flags = do
when (Help `elem` flags) (putStrLn "Usage: program_name options...")
guard (Help `elem` flags)
... do stuff ...
return ()
我想知道是否有一种不错的方式可以在IO Monad中通过对MonadPlus或其他声明来获得一个守卫函数(或类似的东西)。或者也许我做错了什么;有没有更好的方法在上面的函数中编写帮助消息?谢谢。
(附言:我可以使用if-then-else语句,但这似乎有些违背了初衷。更不用说对于很多选项来说,这将导致大量嵌套。)
IO
被赋予了Alternative
和MonadPlus
,如 C. A. McCann 的回答 所描述的那样,包括注意事项。另请参见:MonadPlus IO 不是一个单子。 - duplode