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 <lysxia@gmail.com> wrote:
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:hGetContents

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