Strict getContents

David Feuer david.feuer at gmail.com
Thu Sep 12 14:51:20 UTC 2019


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 at 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 at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20190912/2313bd69/attachment.html>


More information about the Libraries mailing list