
Glynn Clements wrote:
To be more general: how would I send arbitrary binary data (stream of octets) over a socket or a file handle? Should I always assume that only lower bytes would be sent, and this will be forever in ghc?
Yes. Well, maybe not forever, but for the forseeable future.
Well, if it were there forever then one might rely upon it and just construct appropriate String containing only bottom octets in proper sequence.
Or is it a bug?
No. It's just a fundamental design flaw in Haskell. Presumably someone thought that wide-character support was just a question of defining Char, and forgot about a minor issue called "I/O".
Perhaps not Haskell itself; this is just a language (i. e. a tool to describe some program logic). I think the problem is: I/O functions expose the underlying OS (Unix, Windows) to a program, and that OS has absolutely no knowledge of what String is in Haskell (or Java for example). So data chunks must be presented to those functions in the way that the OS understands best. In other words, array of octets fits better than String. In Java runtime, this gap is filled with a bulky layer of various XXXOutputStream's and a bunch of encodings. I guess, Haskell implementation could just enhance the IO subsystem by adding functions taking arrays of octets as their arguments instead of String's. This would not break compatibility with existing programs using String's. What would be really nice to have is some sort of object input/output over network. Then, by sending a String, I would expect it to be recreated at the other end. And if the other end expects, say [Int] then an error would be detected. I haven't looked through the whole GHC runtime, and maybe something like this is already there, any clue is welcome. -- Dmitry M. Golubovsky South Lyon, MI