Тип данных в ByteString - PullRequest
       27

Тип данных в ByteString

2 голосов
/ 13 апреля 2011

У меня есть newtype Я хотел бы сохранить в файл, что-то вроде этого:

type Index = (Int, Int)

newtype Board a = Board { unboard :: Array Index a }

Так что в основном Array. Но, возможно, я хочу добавить некоторые другие данные в один прекрасный день, например:

data BoardWithInfo a = BWI {
    bwiBoard :: Board a,
    bwiRef :: String,
    bwiStart :: Index
}

И так далее. Я просто хочу знать, есть ли какие-либо удобные оптимизированные функции для этого, от Array до ByteString и комбинированные данные - и наоборот. Или как написать свой, если их нет.

Ответы [ 2 ]

3 голосов
/ 13 апреля 2011

Вы захотите использовать Data.Binary с парой экземпляров для упаковки типов Board и BoardWithInfo:

import Control.Monad
import Data.Array
import Data.Binary

type Index = (Int, Int)

newtype Board a = Board { unboard :: Array Index a }
                deriving (Eq, Show)

instance (Binary a) => Binary (Board a) where
  get = liftM Board get
  put b = put (unboard b)

data BoardWithInfo a = BWI { bwiBoard :: Board a
                           , bwiRef :: String
                           , bwiStart :: Index }
                     deriving (Eq, Show)

instance (Binary a) => Binary (BoardWithInfo a) where
  get = liftM3 BWI get get get
  put b = do
    put (bwiBoard b)
    put (bwiRef b)
    put (bwiStart b)

testBoard :: Board Int    
testBoard = Board $ listArray ((1,1),(10,10)) [1..100]

testBWI :: BoardWithInfo Int
testBWI = BWI testBoard "test" (1,1)

-- returns True since the data survives encoding/decoding!
testBinaryRoundtrip = testBWI == testBWI'
  where
    testBWI' = decode $ encode testBWI
2 голосов
/ 13 апреля 2011

Вы можете получить экземпляр Show и сохранить его как таковой или проверить двоичный модуль на предмет взлома.У IIRC есть экземпляр для Arrays.Вам нужно создать свой экземпляр для нового типа, но так как это просто оболочка, это не просто.Двоичный модуль имеет отличную документацию с множеством примеров.

...