Young,
This sounds like a text-book space-leak caused by lazy evaluation.

In a lazy language, function evaluation is driven by the need to perform IO. Because the first version of your program never prints the parsed structure, the parser doesn't completely parse it. This implies that the system needs to hang onto all the input data (as well as all the partially evaluated calls to the parser) incase it needs it later on.

The default string representation is Haskell is pretty abysmal, and having it use hundreds of megs to represent, say a 10 meg file is not too surprising.

By modifying your fixArts function to print the parsed structure you've forced the system to actually finish evaluating the parser, which allows the input data to be garbage collected.

My advice is that if you don't want to fool around with it, just swallow hard, then change fixArts to do a hPutArts to /dev/null.

Either that or
  1) go read about the DeepSeq library.
  2) add strictness annotations to your structure definition.

Ben.


fixArts ((Right x):xs) = do hPutArts stderr x
                            fixArts xs

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to