Я просто написал быстрый код, и я хотел использовать функцию защиты в IO Monad. Тем не менее, существует определение MonadPlus для IO, что означает, что мы не можем использовать защиту в зоне ввода-вывода. Я видел пример использования трансформатора MabyeT для использования защиты в Maybe Monad, а затем снятие всех операций ввода-вывода, но я действительно не хочу делать это, если мне это не нужно.
Некоторый пример того, что я хочу, может быть:
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 или иначе. Или, возможно, я делаю это неправильно; есть ли лучший способ написать это справочное сообщение в функции выше? Спасибо.
(P.S. Я мог бы использовать операторы if-then-else, но, похоже, как-то побеждает точку. Не говоря уже о том, что для множества опций это приведет к огромному количеству вложенности.)