2011-05-31 18 views
5

Estoy tratando de producir un programa Haskell interactivo utilizando la función interact con map.Haskell IO con interact y mapa

Esto es lo que obtengo en ghci (por lo que puedo ver, así es como todos los tutoriales explican el uso de interact, excepto el resultado).

*Module> interact $ unlines . map (++ "!") . lines 
tteesstt 
! 

Tenga en cuenta que lo que realmente sucede es que todos los personajes de tipo I se repitió al instante y después de presionar Retorno aparece el signo de exclamación. Estaba, sin embargo, esta esperando:

*Module> interact $ unlines . map (++ "!") . lines 
test 
test! 

Funciona perfectamente si uso la misma estructura del programa, pero en lugar de filtermap.

Respuesta

8

El problema es que ghci cambia el modo de almacenamiento en búfer a por carácter. Esto es, que el programa comienza a procesar el código tan pronto como esté allí. Si se escribe esta línea en un archivo llamado foo.hs

main = interact $ unlines . map (++ "!") . lines 

y ejecutarlo usando runhaskell foo.hs verá que funciona como se esperaba, debido a Haskell utiliza alineación búfer de forma predeterminada.

+0

http://www.haskell.org/ghc/docs/7.0.3/html/users_guide/ghci-faq.html – rampion

+1

Gracias, esto es perfectamente correcto. Es posible configurarlo en el buffer de línea ejecutando 'import IO' y luego' hSetBuffering stdout LineBuffering'. – notan3xit

2

Como FUZxxl dice, it's a buffering issue.

Para cambiar estilos de tamponamiento en GHCi, utilice hSetBuffering

Prelude> :m +System.IO 
Prelude System.IO> hSetBuffering stdout LineBuffering 
Prelude System.IO> interact $ unlines . map (++"!") . lines 
hello 
hello! 
^CInterrupted. 
Prelude System.IO>