Estaba escribiendo un código rápido, y quería usar el guard function en la IO Monad. Sin embargo, hay no definition of MonadPlus for IO lo que significa que no podemos usar guardia en IO land. He visto an example of using the MabyeT transformer to use guard in the Maybe Monad y luego he levantado todas las acciones IO, pero realmente no quiero hacer eso si no es necesario.MonadPlus definición para Haskell IO
Algunos ejemplos de lo que quiero podrían ser:
handleFlags :: [Flag] -> IO()
handleFlags flags = do
when (Help `elem` flags) (putStrLn "Usage: program_name options...")
guard (Help `elem` flags)
... do stuff ...
return()
Me preguntaba si había una manera agradable para conseguir una función de protección (o algo similar) en la mónada IO a través de una declaración de MonadPlus o de otra manera . O quizás lo estoy haciendo mal; ¿Hay alguna forma mejor de escribir ese mensaje de ayuda en la función anterior? Gracias.
(PS pude utilizar las instrucciones if-then-else, pero parece que derrotar el punto de alguna manera. Por no mencionar que para una gran cantidad de opciones que dará lugar a una enorme cantidad de anidación.)
Esa es una respuesta excelente y me permite entender por qué MonadPlus para IO realmente hace sin sentido sin errores o bucles infinitos. –
@Robert Massaioli: Lo cual no quiere decir que haya algo * incorrecto * con eso. Es una instancia 'MonadPlus' perfectamente correcta, es equivalente a cómo funciona 'MonadPlus' para usar' Either e' como una mónada de error, y creo que una instancia como 'IO' incluso existe en una de las bibliotecas de transformadores de mónada. El único problema es que tienes que ser mucho más cuidadoso con los errores de captura, porque a diferencia de 'MaybeT' o similar, las excepciones pueden escaparse hasta 'main'. –