【发布时间】:2011-05-29 02:48:22
【问题描述】:
我只是写了一点代码,我想在 IO Monad 中使用guard function。但是,有no definition of MonadPlus for IO 这意味着我们不能在 IO 域中使用守卫。我见过an example of using the MabyeT transformer to use guard in the 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 Monad 中获取保护函数(或类似的东西)。或者我做错了;有没有更好的方法在上面的函数中编写帮助消息?谢谢。
(PS 我可以使用 if-then-else 语句,但它似乎以某种方式破坏了这一点。更不用说对于很多选项它会导致大量嵌套。)
【问题讨论】:
-
注:发布此问题后的几个 GHC 版本,
IO以C. A. McCann's answer 描述的方式给出了Alternative和MonadPlus,包括警告。另见:MonadPlus IO isn't a monoid.
标签: haskell io monads alternative-functor monadplus