2010/1/26 José Pedro Magalhães <span dir="ltr">&lt;<a href="mailto:jpm@cs.uu.nl">jpm@cs.uu.nl</a>&gt;</span><br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hi Jeremy,<br><br>As Neil Mitchell said before, if you really don&#39;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&#39;ve been using it already and performance is not a big problem, then I guess it&#39;s ok.<br>


<br>Regarding the Serialize issue, maybe I am not understanding the problem correctly: isn&#39;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&#39;t be hard either, I think. Then you could have a trivial way of generating instances of Serialize, namely something like<br>


<blockquote style="border-left:1px solid rgb(204, 204, 204);margin:0pt 0pt 0pt 0.8ex;padding-left:1ex;font-family:courier new,monospace" class="gmail_quote">instance Serialize MyType where<br>  getCopy = gget<br>
  putCopy = gput</blockquote></blockquote><div><br></div><div>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.</div>
<div><br></div><div>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:</div><div><br></div><div>data ClockTime = TOD Integer Integer</div>
<div><br></div><div>Let&#39;s say that it is later changed to:</div><div><br></div><div>data ClockTime = TOD Bool Integer Integer</div><div><br></div><div>Attempting to read the old data you saved would now fail, because the saved data does not have the &#39;Bool&#39; 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:</div>
<div><br></div><div>$(deriveSerialize &#39;&#39;Old.ClockTime)</div><div>instance Version Old.ClockTime</div><div><br></div><div>$(deriveSerialize &#39;&#39;ClockTime)</div><div>instance Version ClockTime where</div><div>
   mode = extension 1 (Proxy :: Proxy Old.ClockTime)</div><div><br></div><div>instance Migrate Old.ClockTime ClockTime where</div><div>   migrate (Old.TOD i j) = TOD False i j</div><div><br></div><div>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.</div>
<div><br></div><div>- jeremy</div></div>