
Certainly reading directly into a String is inefficient for a strict read.
I imagine the best way is to read (eagerly) into a lazy ByteString and
decode that lazily into a String. Even for Text, it may well be better to
read into a lazy ByteString and decode into lazy Text, since the latter
tends to take considerably more memory.
On Wed, Sep 11, 2019, 2:01 PM Li-yao Xia
Hello Libraries,
In base, the functions which read all contents from a handle or file into one String currently all do lazy IO: readFile, getContents, hGetContents.
https://hackage.haskell.org/package/base-4.12.0.0/docs/System-IO.html#v:hGet...
The easiest way to get a strict alternative seems to be to explicitly force the list, for example using ```length contents `seq` pure ()```, but that's far from an obvious solution.
Is there a better way?
If not, I propose to add readFile', getContents', hGetContents', which don't do lazy IO.
It regularly creates confusion among beginners, and it's easy to assume that lazy IO is benign if that's the only way to do certain operations, when it's arguably the wrong way to read files to begin with.
Cheers, Li-yao _______________________________________________ Libraries mailing list Libraries@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries