[Haskell-cafe] Re: could we get a Data instance for Data.Text.Text?

Jeremy Shaw jeremy at n-heptane.com
Tue Jan 26 12:25:48 EST 2010


2010/1/26 José Pedro Magalhães <jpm at cs.uu.nl>

> Hi Jeremy,
>
> As Neil Mitchell said before, if you really don't want to expose the
> internals of Text (by just using a derived instance) then you have no other
> alternative than to use String conversion. If you've been using it already
> and performance is not a big problem, then I guess it's ok.
>
> Regarding the Serialize issue, maybe I am not understanding the problem
> correctly: isn't that just another generic function? There are generic
> implementations of binary get and put for at least two generic programming
> libraries in Hackage [1, 2], and writing one for SYB shouldn't be hard
> either, I think. Then you could have a trivial way of generating instances
> of Serialize, namely something like
>
>> instance Serialize MyType where
>>   getCopy = gget
>>   putCopy = gput
>
>
But in what package does, instance Serialize Text, live? text?
happstack-data? a new package, serialize-text? That is the question at hand.
Each of those choices has rather annoying complications.

As for using generics, Serialization can not be 100% generic, because we
also support migration when the type changes. For example, right now
ClockTime is defined:

data ClockTime = TOD Integer Integer

Let's say that it is later changed to:

data ClockTime = TOD Bool Integer Integer

Attempting to read the old data you saved would now fail, because the saved
data does not have the 'Bool' value. However, perhaps the old data can be
migrated by simply setting the Bool to True or False by default. In
happstack we would have:

$(deriveSerialize ''Old.ClockTime)
instance Version Old.ClockTime

$(deriveSerialize ''ClockTime)
instance Version ClockTime where
   mode = extension 1 (Proxy :: Proxy Old.ClockTime)

instance Migrate Old.ClockTime ClockTime where
   migrate (Old.TOD i j) = TOD False i j

The Version class is a super class of the Serialize class, which is required
so that when the deserializer is trying to deserialize ClockTime, and runs
across an older version of the data type, it knows how to find the older
deserialization function that works with that version of the type, and where
to find the migrate function to bring it up to the latest version.

- jeremy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/haskell-cafe/attachments/20100126/679931fe/attachment.html


More information about the Haskell-Cafe mailing list