Бинарная сериализация в Haskell: использование библиотеки derive

Март 4, 2011, 19:50

В рамках борьбы с велосипедизмом, я просто обязан написать про библиотеку derive. Служит она для автоматической генерации инстансов разных классов (смотрите документацию каких именно, там много). Меня эта библиотека заинтересовала, прежде всего, как генератор для Data.Binary, которая очень удобна как быстрый бинарный сериализатор над Data.ByteString.Lazy. У себя на сайте я использую Data.Binary для кеширования данных.

Derive умеет генерировать как обычный код внутри .hs файлов, так и создавать инстансы во время компиляции с помощью Template Haskell.

Генератор внутри .hs у меня глючит, имейте ввиду если что. Из описанных в документации способов нормально работает только такой:

1
2
3
4
5
6
7
8
9
10
module Main where  

import Data.Binary

data SomeData = ConstrA | ConstrB Int | ConstrC String Int
deriving (Show)

{-!
deriving instance Binary SomeData
!-}

С последующим вызовом

derive --append <file> 

который допишет в ваш файл нужный инстанс.

Работа через Template Haskell вопросов не вызвала (да и вообще этот способ проще в использовании):

1
2
3
4
5
6
7
8
9
10
{-# LANGUAGE TemplateHaskell #-} 
module Main where

import Data.Binary
import Data.DeriveTH

data SomeData = ConstrA | ConstrB Int | ConstrC String Int
deriving (Show)

$(derive makeBinary ''SomeData)

Проверяем:

*Main> encode (ConstrB 123) 
Chunk "\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL{" Empty
*Main> decode (encode (ConstrB 123)) :: SomeData
ConstrB 123

Немного об инсталляции derive. Она зависит от haskell-src-exts, которой, в свою очередь, нужен установленный happy. Happy компилируется в обычный бинарник и ставится в /home/<user>/.cabal/bin (если ставить cabal-ом в home), так что перед установкой derive поставьте сначала happy и убедитесь что в PATH у вас есть нужный путь.

UPD: Happy входит в состав Haskell Platform (2011.2.0.0 во всяком случае), так что если есть Haskell Platform, то happy тоже есть.

blog comments powered by Disqus
Сергей Лымарь © 2005-2011, Все права защищены. Сайт реализован на языке Haskell