2012-06-04 31 views
7

Probablemente no entiendo muy bien la món IO.Haskell IO Monad y uso de memoria

Si escribo una aplicación que se espera que se ejecute durante muchos meses, mientras tanto registrando su progreso, ¿guardará la mónima IO toda la información de registro en la RAM hasta el final?

Desde el blog en IO Inside, modelos Haskell el mundo como

main :: RealWorld -> ((), RealWorld) 

IO para que no se produce durante la ejecución de la parte del código Haskell, pero sólo cuando la aplicación vuelve desde main.

Probablemente estoy malinterpretando esto completamente. ¿Alguien podría explicar cuando Haskell realmente hace IO?

Respuesta

8

¿almacenará la mónima IO toda la información de registro en la RAM hasta el final?

No. No debe pensar en "la mónada IO" como algo que realiza acciones. Es solo una forma matemática de representar programas imperativos. Los programas imperativos primitivos son cosas como getChar; >>= se usa para unir dos programas en un programa imperativo más grande. La mónada IO es el conjunto de todos los programas imperativos.

considerar un programa como

main = putStr "Hello, " >> putStrLn "world!" 

Esto significa: main es un programa que se ejecuta el programa de putStr "Hello, ", y una vez hecho esto, ejecuta el programa putStrLn "world!". No es necesario que el intérprete de Haskell o el programa compilado guarden ningún estado en la memoria a excepción de un puntero de instrucción, es decir, "dónde estamos y qué ejecutamos a continuación".

La metáfora RealWorld -> ((), RealWorld) puede haberle confundido ya que parece implicar una transformación del estado del mundo exterior a un nuevo estado que debe calcularse en su totalidad, después de lo cual el mundo puede actualizarse para reflejar el estado calculado. Eso no es lo que sucede en absoluto. La wiki de Haskell advierte al respecto:

La siguiente historia sobre IO es incorrecta, ya que no puede explicar algunos aspectos importantes de IO (incluida la interacción y la concurrencia).

+0

Gracias por la buena explicación. He leído "Learn You a Haskell" (actualmente en mi segunda lectura de la sección de mónadas) y comencé "Real-World Haskell". A menos que me haya perdido algo, ninguno deja en claro que IO ocurre inmediatamente, sino que, al igual que otras mónadas, se "acumula" hasta el final.Creo que necesito ver el resultado del lenguaje ensamblador del compilador para convencerme a mí mismo :-). – Ralph

+0

La metáfora 'RealWorld -> ((), RealWorld)' ciertamente parece implicar que la transformación ocurre en forma pura y solo se emite en su totalidad al final. Supongo que las implementaciones subyacentes de las operaciones de IO realmente ocurren "bajo demanda". – Ralph

+5

@Ralph: la clave para entender la mónada IO es que acumula * programas *, no entradas ni salidas reales. Pocos tutoriales de Haskell explican esto bien. –

4

¿almacenará la mónima IO toda la información de registro en la RAM hasta el final?

No. Suponiendo que está utilizando una estrategia razonable de registro.

Haskell realiza IO cuando el resultado es exigido por su programa; que para la mayoría de las acciones es inmediato. (La excepción son las bibliotecas de entrada de archivos vagos, donde los archivos no se leen necesariamente hasta que el programa usa los datos).