
On Wed, Dec 16, 2009 at 9:40 AM, haskell@kudling.de
Hi,
i am not quite sure how to do this in the most elegant way:
I have some data structures:
data A = A Double data B = B Double data C = C Double ...
and i want to allow only a subset in another data structure, so i did something like this:
data SubSet = SubSetA A | SubSetC C
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: 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