I haven&#39;t tested this idea, but it occurred to me that this might be a good place for data families:<div><br></div><div>data Z = Z</div><div>newtype S n = S n</div><div><br></div><div>-- Some nastiness to avoid having to see into the future?</div>
<div>type family Pred n :: *</div><div>type instance Pred (S n) = n</div><div>type instance Pred Z = Z</div><div><br></div><div>class MyDataClass ver where</div><div>  data MyData ver :: * </div><div>  upgrade :: MyData (Pred ver) -&gt; MyData ver</div>
<div>  -- other methods that won&#39;t change from version to version</div><div><br></div><div><meta charset="utf-8"><div>class Less a b</div><div>instance Less Z a</div><div>instance Less a b =&gt; Less a (S b)</div><div>
<br></div><div>convert :: Less a b =&gt; MyData a -&gt; MyData b</div><div>-- you may need a method in Less to witness the less-ness, but then you&#39;d iterate your upgrade until you reach the version you want.</div></div>
<div><br></div><div>-- Then you might want to abstract over this class with an existential, so it doesn&#39;t infect other things:</div><div>data MyDataGeneral = forall ver. MyDataClass ver =&gt; MyDataGeneral ver</div><div>
<br></div><div>-- now make instances for versions you have, with data instances for your current version of the structure.</div><div><br></div><div><br></div><div>This might not even compile as I just wrote it into my email client, but it seems like it could work. Any comments?</div>
<div><br></div><div>Dan</div><div><br></div><div><div class="gmail_quote">On Thu, Dec 16, 2010 at 1:26 PM, Dmitry V&#39;yal <span dir="ltr">&lt;<a href="mailto:akamaus@gmail.com">akamaus@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Greetings,<br>
<br>
while developing my neural net simulator I stumbled upon a problem.<br>
<br>
I have a data type NeuralNet and use Show and Read instances for saving and loading configurations. As time passed, I changed the data type, so the program can no longer load files saved in previous versions.<br>
<br>
I want fix it. My current idea looks as follows. I&#39;m going to create a bunch of types NN1, NN2, NN3..NNn for different versions and write converters c12 :: N1 -&gt; N2, c23 :: N2 -&gt; N3 and so on.<br>
<br>
But how to organize the whole process of parsing String into NNn so it&#39;s easy to change formats?<br>
Something based on using a list of parsers<br>
[read, c43 . read, c43 . c23 . read, c43, c23 . c12 . read, c43 . c32 . c21 . read]<br>
<br>
looks rather verbose and grows quadratically with N.<br>
<br>
I&#39;m sure there must be a more elegant way. Any ideas?<br>
<br>
Dmitry<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org" target="_blank">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div>