Hey Sebastiaan, Generation of a single value (the leftmost), for instance, can be done as follows: {-# OPTIONS_GHC -fglasgow-exts #-} module Left where import Generics.MultiRec.Base class Left (phi :: * -> *) (f :: (* -> *) -> * -> *) where leftf :: phi ix -> (forall ix'. El phi ix' => phi ix' -> r ix') -> [f r ix] instance (Left phi a, Left phi b) => Left phi (a :+: b) where leftf w f = map L (leftf w f) ++ map R (leftf w f) instance (Constructor c, Left phi f) => Left phi (C c f) where leftf w f = map C (leftf w f) instance (Left phi a, Left phi b) => Left phi (a :*: b) where leftf w f = zipWith (:*:) (leftf w f) (leftf w f) instance (El phi xi) => Left phi (I xi) where leftf _ f = [I (f index)] instance Left phi U where leftf _ _ = [U] instance (EqS phi, El phi ix, Left phi f) => Left phi (f :>: ix) where leftf w f = case eqS (proof :: phi ix) w of Nothing -> [] Just Refl -> map Tag (leftf w f) instance LeftA a => Left phi (K a) where leftf _ _ = [K lefta] class LeftA a where lefta :: a instance LeftA Char where lefta = 'L' instance LeftA () where lefta = () left :: (El phi ix, Fam phi, Left phi (PF phi)) => phi ix -> ix left w = to w $ head $ leftf w (I0 . left) I also have an arbitrary, but that's slightly more complex. Generic read should be available soon. Cheers, Pedro On Mon, May 25, 2009 at 15:11, Sebastiaan Visser <sfvisser@cs.uu.nl> wrote:
Hey guys,
While playing around with MultiRec most things are pretty straightforward and most usage can be derived from the examples. The only thing that seems tricky to do, and of which I cannot find any examples, are generic producers.
Any examples of generic producers that take no values as input but do produce values as output? E.g. generic parsers (read), binary get, arbitrary?
I have some `SingleRec' producers that are fairly trivial to port except for the `Tag' case. Any clues?
Thanks,
-- Sebastiaan Visser
_______________________________________________ Generics mailing list Generics@haskell.org http://www.haskell.org/mailman/listinfo/generics