
Café, SYB-style libraries (and especially Uniplate) make it very easy to run generic traversals (queries/transformations) on ADTs.
data Expr = ... x :: Expr f :: Expr -> Expr transform :: (Expr -> Expr) -> Expr -> Expr transform f x :: Expr -- applies f to x (and its children) in a bottom-up manner
Uniplate is very powerful and doesn't require any hand written type-class instances to get going reasonably efficiently. I can simply re-implement the functionality of Uniplate myself, modulo requiring hand-written instances. (I didn't want to go into that road, since I don't need it for this argument.) I did this exercise, because I wanted to understand why we don't have similar generic traversal libraries for GADTs. And, it didn't take long :) I can post my trials but they are really baby steps and they wouldn't be helpful. My question is: Considering how useful generic traversal libraries and GADTs are, has anybody tried implementing a generic traversal library (like Uniplate or similar) for GADTs? Is it a hard (or impossible, or not efficient, or problematic in some other way) thing to implement, or is it just not a requirement for anyone else? Best, Ozgur
participants (1)
-
Ozgur Akgun