Hello apfelmus, Thursday, October 12, 2006, 4:42:14 PM, you wrote:
> A better solution would be to begin output before the the whole input is > read, thus making things more lazy. This can be done the following way: > from the input, construct a lazy list of (date,line) pairs. Then, let > foldM thread a map from dates to corresponding output file pointers > through the list and, at the same time, use the file pointers to output > the line in question via appendFile. This way, every line consumed is > immediately dispatched to its corresponding output file and things > should only require memory for the different dates, besides buffering. > In a setting without IO, the task corresponds to the "Optimization > Problem" discussed at length in September on this list. The problem here > is that writeFile currently cannot be interleaved lazily, this has to be > simulated with appendFile. We can read files lazily but we cannot output > them lazily. > Can this be remedied? Can there be a version of writeFile which is, in a > sense, dual to getContents? this can be solved in other way. here is a program that reads stdin and puts to stdout lines starting with '>' and to stderr the rest. note that our main processing function is pure: main = do a <- getContents let b = map (processing stdout stderr) (lines a) mapM_ (\(file,line) -> hPutStrLn file line) b processing file1 file2 line = if ">" `isPrefixOf` line then (file1,line) else (file2,line) -- Best regards, Bulat mailto:[EMAIL PROTECTED] _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe