phil: > On Wed, Jul 04, 2007 at 09:02:15PM +1000, Donald Bruce Stewart wrote: > >phil: > >>On Sun, Jul 01, 2007 at 06:07:13PM +0100, Andrew Coppin wrote: > >>>I haven't actually tried, but presumably a TCP connection is represented > >>>in the same way as a file, and so has the same problems. > >>> > >>>Basically doing binary I/O seems to be one of those things that in > >>Haskell >falls into the class of "it's possibly but annoyingly messy"... > >> > >>In an ideal world there would be a 'deriving Serializable[1]' you > > > >derive Binary > > (use an external tool for this) > > such as?
Binary instances are pretty easy to write. For a simple data type: > instance Binary Exp where > put (IntE i) = do put (0 :: Word8) > put i > put (OpE s e1 e2) = do put (1 :: Word8) > put s > put e1 > put e2 > get = do tag <- getWord8 > case tag of > 0 -> liftM IntE get > 1 -> liftM3 OpE get get get The Data.Binary comes with one tool to derive these. The DrIFT preprocessor also can, as can Stefan O'Rear's SYB deriver. I just write them by hand, or use the tool that comes with the lib. More docs here, http://hackage.haskell.org/packages/archive/binary/0.3/doc/html/Data-Binary.html > > >>could do on datatypes which would get this right. In a really ideal > >>world, you could specify the data layout somehow[2][2a], which would > > > >Directly in Haskell data type decls -- see the ICFP 05 paper on the > >House OS, which added packing annotations, and bit syntax. In current > >Haskell, you specify the layout in instances Storable or Binary. > > I'll have a look. > > >>make integrating Haskell code into a wider distributed network of > >>processes exchanging binary data a cinch. In a super really ideal > > > >Definitely. See things like the zlib or iconv > >Data.Binary/Data.ByteString bindings, for prototypes. The 'tar' > >reader/writer on hackage.haskell.org is also a good example. > > OK. Maybe this is the sort of stuff which ought to go into the new > Haskell book? 'Integrating Haskell with external data sources' or > something... Indeed :-) > >>world, you could operate on the packets in place in Haskell where > >>possible and save the deserialization overhead... > > > >Data.ByteString.* for this. > > > >>Anyone trying to do any of this? > > > >Yeah, its a bit of a hot topic currently. :) > > >Gotta chase Erlang for hacking network data. > > Absolutely. Ta for the pointers anyway. Yeah, so: Data.ByteString Data.Bits Data.Binary Hack those bytes! Quickly! :-) -- Don _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe