
Hi all, thanks for your ideas so far.
I think you might be looking for too much sugar. I don't know much about your problem, but I would use approximately your approach and be straightforward:
To bother you with some details: i am building a model for an SVG document. http://chlor.svn.sourceforge.net/viewvc/chlor/trunk/haskell/Chlor/FileFormat... There are many SVG elements, of which only a few are valid as the content of each other SVG elements. SvgDocumentElement defines the allowed subset for the SVG document. I want to generate a "DList Char" for all those sub-elements and finally collapse them to one "DList Char" representing the whole SVG document. So it's a bit more complicated than your "Either" example I need to manually efine such subset data structures for most SVG elements which does not feel most elegant already. Additionally instantiating a class for the subset structures, in order to being able to iterate over them, feels even more clumsy. So i wonder whether i am missing a more clean approach to the problem "easily combining data structures but also easy iteration over them".
type SubSet = Either A C
and use it in Foo:
data Foo = Foo [SubSet]
No i want to perform a polymorphic operation on the contents of A,B,C, e.g.
doSomething :: Foo -> [Double] doSomething (Foo s) = map doSomethingElse s
doSomething (Foo s) = map (doSomethingWithA ||| doSomethingWithC) s
(||| is from Control.Arrow)
If that gets too complicated, you can build the "doSomething" functions in a type-directed way using typeclasses:
class DoSomething a where doSomething :: a -> Double
instance DoSomething A where ... instance DoSomething B where ... instance DoSomething C where ...
instance (DoSomething a, DoSomething b) => DoSomething (Either a b) where doSomething = doSomething ||| doSomething
Luke