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

Март 04, 2011, 19:50

В рам­ках борь­бы с ве­ло­си­пе­диз­мом, я про­сто обя­зан на­пи­сать про биб­лио­те­ку de­rive. Слу­жит она для ав­то­ма­ти­че­ской ге­не­ра­ции ин­стан­сов раз­ных клас­сов (смот­ри­те до­ку­мен­та­цию ка­ких имен­но, там мно­го). Меня эта биб­лио­те­ка за­ин­те­ре­со­ва­ла, пре­жде все­го, как ге­не­ра­тор для Data.Bi­na­ry, ко­то­рая очень удоб­на как быст­рый би­нар­ный се­ри­а­ли­за­тор над Data.ByteString.Lazy. У себя на сай­те я ис­поль­зую Data.Bi­na­ry для ке­ши­ро­ва­ния дан­ных. De­rive уме­ет ге­не­ри­ро­вать как обыч­ный код внут­ри .hs фай­лов, так и со­зда­вать ин­стан­сы во вре­мя ком­пи­ля­ции с по­мо­щью Tem­plate 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>

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

Ра­бо­та че­рез Tem­plate 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

Немно­го об ин­стал­ля­ции de­rive. Она за­ви­сит от haskell-src-exts, ко­то­рой, в свою оче­редь, ну­жен уста­нов­лен­ный hap­py. Hap­py ком­пи­ли­ру­ет­ся в обыч­ный би­нар­ник и ста­вит­ся в (если ста­вить ca­bal-ом в home), так что пе­ред уста­нов­кой de­rive по­ставь­те сна­ча­ла hap­py и убе­ди­тесь что в PATH у вас есть нуж­ный путь.

UPD: Hap­py вхо­дит в со­став Haskell Plat­form (2011.2.0.0 во вся­ком слу­чае), так что если есть Haskell Plat­form, то hap­py тоже есть.

blog comments powered by Disqus
Сергей Лымарь © 2005-2014, Все права защищены.