
Bulat Ziganshin wrote:
there are also many other similar issues, such as lack of good syntax for "for", "while", "break" and other well-known statements,
On the other hand you have an ability to define your own control structures.
i have a lot, but their features are limited, both in terms of automatic lifting and overall syntax. let's consider
while (hGetBuf h buf bufsize == bufsize) crc := updateCrc crc buf bufsize break if crc==0 print crc
I guess that the crc is a simple fold over the single bytes: crc xs = foldl' (\crc word8 -> crc `xor` word8) 0 xs You do not need xs to be an inefficient String, Data.ByteString.Lazy gives you single byte access (f.i. via fold) but internally reads stuff in a chunked way, just like you now manually do with hGetBuf. Lazy evaluation is very handy for separating those the two concerns of reading the chunks of bytes and presenting them in a non-chunked way. Regards, apfelmus