Hello, On Thu, Aug 20, 2009 at 16:54, Max Desyatov <explicitc...@googlemail.com>wrote:
> Sean Leather <leat...@cs.uu.nl> writes: > > > I'm not sure the problem you're running into is strictly a generic > > programming (GP) one. Typically, GP takes code that is often written > > and generalizes it, so that it doesn't have to be written for multiple > > datatypes. > > That seems to be GP problem, as your solution doesn't scale well when I > wan't to add/remove/change fields in the `Row` record. The perfect way > as I see it, would be just editing `Row` data declaration, nothing else. > Studying few papers about GP in Haskell, I reckon this could be > represented as generic traversal, using my `Row` declaration with > `Either`. I don't see really good way to write a generic producer from > `[String]` to version of `Row` without `Either`. But SYB doesn't > provide a way for passing type-class-parametric functions to gmapT, and > SYB-with-class has large overhead of its usage. I don't have enough > time to find out how this can be written in SYB-with-class, if it really > can be > written. The restriction of EMGM was described in my initial message. Indeed SYB doesn't work here because Typeable-based run-time type comparison only works for monomorphic types. Doing something like readRow l = gmapT (mkT (\(Left (Just ri) :: E Name) -> Right $ l `atMay` ri > >>= readMay)) > would work, but this, of course, is not what you want. I'm guessing the polymorphic typeOf previously described by Oleg [1] could help here, were it integrated in SYB. I don't think syb-with-class will help you here, since it only adds modularity to the type-based function extension. I think you would still have to write a case for every field in the Row record. Multirec would possibly work, were it not for the fact that it doesn't support parametric datatypes yet... Cheers, Pedro [1] http://osdir.com/ml/haskell-cafe@haskell.org/2009-03/msg00212.html
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe