2011-09-16 19 views
5

Soy nuevo en Haskell. Escribí mi propia mónada que es la mónada Estado con la gestión de errores:¿Cómo agregar IO a mi propia mónada en Haskell?

newtype MyMonad a = MyMonad (State -> Either MyError (State, a)) 

lo uso en un intérprete de un lenguaje pequeño. Ahora quiero agregar algunas operaciones IO a mi lenguaje (lectura/escritura), pero no sé cómo incluir IO mónada dentro de la mía. Sé que podría combinar ErrorT, StateT, IO y lograr este resultado, pero ¿hay alguna otra manera de hacerlo sin ellos?

Respuesta

6

Puede ver cómo se implementa StateT:

newtype StateT s m a = StateT { runStateT :: s -> m (a,s) } 

Para combinar con IO estado que acaba de poner en su lugar de IOm y obtener el tipo deseado: s -> IO (a,s).

Si tiene errores también, esto se convierte en algo así como s -> IO (Either e (a, s)) o s -> IO (Either e a, s) dependiendo de si desea que los cálculos fallidos afecten al estado.

Tenga en cuenta que no puede hacer s -> Either e (IO (a, s)) una mónada sin una máquina de tiempo .

actualización

resulta que no se puede hacer una mónada incluso con la máquina del tiempo.

para mostrar por qué es imposible, vamos a simplificar nuestra mónada mediante el uso de () en lugar de s primera: data M e a = M { runM :: Either e (IO a) }

Ahora, imaginemos el siguiente programa:

unsafePerformIO :: IO a -> a 
unsafePerformIO io = fromLeft $ runM $ do 
    a <- M $ Right $ io 
    M $ Left a 

Obviamente, esta función es imposible y por lo tanto, la instancia de mónada para M también es imposible.

Lo que la máquina del tiempo podría darle es la capacidad de tratar IO exactamente como uno trata State. Sin embargo, no me di cuenta de que Either e (s -> (a, s)) no es una mónada.

+0

¿Máquina de tiempo? ¿Puedes proporcionar algún contexto? ¿Es una broma "con intención de juego de palabras", o es algún término avanzado de matemática/ciencia de programación? – Tarrasch

+1

No hay juegos de palabras aquí, estoy hablando de una máquina de tiempo real. Una vez que lo tienes, puedes implementar esta mónada. – Rotsor

+1

@Rotsor: se preocupe por explicar * ¿por qué * dijo que se requiere una máquina de tiempo? – ivanm