ANNOUNCE: Multiplate 0.0.1

Multiplate is a lightweight generic library for mutually recursive data types that won't make Conor lose his lunch. Multiplate is an alternative extension of the Uniplate/Compos core design to support mutually recursive datatypes in a way that is as powerful as Compos, almost as easy to use as Uniplate, and more portable than both of them. Multiplate does not require you to rewrite your data type, does not require run-time reflection, does not require GADTs, and does not even require multi-parameter type classes. It only requires rank 3 polymorphism. http://hackage.haskell.org/package/multiplate-0.0.1 A more detailed paper is forthcoming, but the library is available to try right now. -- Russell O'Connor http://r6.ca/ ``All talk about `theft,''' the general counsel of the American Graphophone Company wrote, ``is the merest claptrap, for there exists no property in ideas musical, literary or artistic, except as defined by statute.''

Hi all, I made a little extension that makes it a bit easier to work with
Multiplate, there's a detailed explanation here:
http://hackage.haskell.org/package/multiplate-simplified
However, there's still some biolerplate that could be eliminated but I can't
seem to do it nicely. When writing a Multiplate instance one has define a
method called mkPlate:
mkPlate build = Plate (build pProg) (build pDecl) (build pExpr) (build pVar)
by using my package all arguments for Plate can be the same:
mkPlate build = Plate
(build $ getProjector undefined undefined)
(build $ getProjector undefined undefined)
(build $ getProjector undefined undefined)
(build $ getProjector undefined undefined)
but the following doesn't work:
withProj build = build $ getProjector undefined undefined
mkPlate build = Plate
(withProj build)
(withProj build)
(withProj build)
(withProj build)
neither does this one, though it gives a less scary error message:
mkPlate build = Plate withProj withProj withProj withProj
where
withProj = build $ getProjector undefined undefined
All the code necessary to test this is included at the end of the source of
the modules's hackage page.
Also, there's a probably similar issue if I define functions from Multiplate
like this:
makeG funcFor = \ f a -> funcFor (getProjector f a) f a
gtraverseFor = makeG traverseFor
but this one works:
gtraverseFor :: (IsProjector p a) => p Identity -> a -> a
gtraverseFor f a = traverseFor (getProjector f a) f a
On Sat, Nov 20, 2010 at 04:45,
Multiplate is a lightweight generic library for mutually recursive data types that won't make Conor lose his lunch.
Multiplate is an alternative extension of the Uniplate/Compos core design to support mutually recursive datatypes in a way that is as powerful as Compos, almost as easy to use as Uniplate, and more portable than both of them.
Multiplate does not require you to rewrite your data type, does not require run-time reflection, does not require GADTs, and does not even require multi-parameter type classes. It only requires rank 3 polymorphism.
http://hackage.haskell.org/package/multiplate-0.0.1
A more detailed paper is forthcoming, but the library is available to try right now.
-- Russell O'Connor http://r6.ca/ ``All talk about `theft,''' the general counsel of the American Graphophone Company wrote, ``is the merest claptrap, for there exists no property in ideas musical, literary or artistic, except as defined by statute.'' _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe
participants (2)
-
Balázs Endrész
-
roconnor@theorem.ca