Здравствуйте, BitField, Вы писали:
BF>А расскажите пожалуйста, как каноничнее писать чтение/запись (вернее, сборку/разборку) бинарных файлов определенного формата.
BF>Сейчас есть такое:
BF>BF>type Bin = ByteString
BF>class RW a where
BF> readBin :: Bin -> (a, Bin)
BF> writeBin :: a -> Bin -> Bin
BF>-- standard types
BF>instance RW Word8 where
BF> readBin = ...
BF> writeBin = ...
BF>instance RW Word16 where ...
BF>instance RW Int8 where ...
BF>-- file objects
BF>instance RW FileHeader where ...
BF>instance RW FileRecord where ...
BF>
Каноничнее всего использовать существующие библиотеки сериализации: binary [1] или cereal [2].
Для первой нужно будет объявнить instance Binary для второго Serialize.
binary: входит в base, умеет только Lazy.ByteString, достаточно быстрый. Serialize не входит
в base, умеет как ленивые, так и строгие строки, говорят, то такой же по скорости. Можно ещё
почитать соотвествующую тему в haskell-cafè [3].
[1]
http://hackage.haskell.org/package/binary-0.5.1.1
[2]
http://hackage.haskell.org/package/cereal-0.3.5.2
[3]
http://www.haskell.org/pipermail/haskell-cafe/2010-July/079790.html