
apfelmus writes:
Remember that Haskell expressions are evaluated lazily, that's why we have the IO monad for doing input/output.
I see. Thank you for the clarification.
Hence, mutable values that look like pure ones become unpredictable and are considered a major sin in Haskell land, please don't do it.
It feels patronizing to tell someone else what he should or shouldn't do. What can I say? Outside of Haskell land there are people who believe that software should, like, work, instead of falling apart whenever you feed it input data larger than a few kilobytes and to reach that objective those people are absolutely prepared to face the wild unpredictability of -- *gasp* -- pointers!
As catBuf crucially depends on the mutability of the buffer, ByteStrings are not the right data structure to use in that case, that's all there is to it.
A ByteString is a pointer, a byte size, and a byte offset. As such, it is the perfect data structure for a program like catBuf. Let's agree to disagree. Best regards, Peter