More specifically, I want to transform a tree of SomeExpr to a tree of (SomethingElse, SomeExpr), "prefixing" each node with a default value in the process.
The result have essentially the same structure as the input.
data ASTAttachment = AA {} deriving (Eq,Read,Show,Ord,Typeable,Data)
type family AST a :: *
type instance AST () = ASTExpr ()
type instance AST AA = (AA, ASTExpr AA)
data ASTExpr a
= ALiteral String
| AApplication [AST a] (ASTOp a)
| ARef String
| ABind (AST a) String
| AMany (ASTMany a)
data ASTOp a
= AOSym String
| AOAlpha String
| AOMany (ASTMany a)
data ASTMany a
= AMSimple [AST a]
| AMAggeregate [AST a]
deriving instance Typeable ASTMany
deriving instance Typeable ASTOp
deriving instance Typeable ASTExpr
deriving instance Data (ASTMany ())
deriving instance Data (ASTOp ())
deriving instance Data (ASTExpr ())
Currently I have values of type (AST ()), and I need to transform them to (AST ASTAttachment) in the obvious way.
Now I'm stuck at "derive instance Data (ASTExpr ASTAttachment)", where ghc reports "Multiple declarations of '$cSomeConstructor'".
Even if I can get past this, I still don't know how to use SYB to transform between trees of different types.