I haven't tested this idea, but it occurred to me that this might be a good place for data families:
data Z = Z newtype S n = S n -- Some nastiness to avoid having to see into the future? type family Pred n :: * type instance Pred (S n) = n type instance Pred Z = Z class MyDataClass ver where data MyData ver :: * upgrade :: MyData (Pred ver) -> MyData ver -- other methods that won't change from version to version class Less a b instance Less Z a instance Less a b => Less a (S b) convert :: Less a b => MyData a -> MyData b -- you may need a method in Less to witness the less-ness, but then you'd iterate your upgrade until you reach the version you want. -- Then you might want to abstract over this class with an existential, so it doesn't infect other things: data MyDataGeneral = forall ver. MyDataClass ver => MyDataGeneral ver -- now make instances for versions you have, with data instances for your current version of the structure. This might not even compile as I just wrote it into my email client, but it seems like it could work. Any comments? Dan On Thu, Dec 16, 2010 at 1:26 PM, Dmitry V'yal <akam...@gmail.com> wrote: > Greetings, > > while developing my neural net simulator I stumbled upon a problem. > > 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. > > I want fix it. My current idea looks as follows. I'm going to create a > bunch of types NN1, NN2, NN3..NNn for different versions and write > converters c12 :: N1 -> N2, c23 :: N2 -> N3 and so on. > > But how to organize the whole process of parsing String into NNn so it's > easy to change formats? > Something based on using a list of parsers > [read, c43 . read, c43 . c23 . read, c43, c23 . c12 . read, c43 . c32 . c21 > . read] > > looks rather verbose and grows quadratically with N. > > I'm sure there must be a more elegant way. Any ideas? > > Dmitry > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe >
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe