I guess the point is that you can't put type names into the declaration of some other type. data A = ... data B = ... -- No good data AorB = A | B f :: Int -> AorB f x | even x = Aconstructor x | otherwise = Bconstructor x -- OK data AorB = AType A | BType B f :: Int -> AorB f x | even x = AType $ Aconstructor x | otherwise = BType $ Bconstructor x What's confusing is that data AorB = A | B compiles with error. That raises the question of what it really means! *-- Russ* *** * ** On Tue, Dec 14, 2010 at 12:35 PM, Tobias Brandt <tob.brandt@googlemail.com>wrote:
On 14 December 2010 21:26, Russ Abbott <russ.abbott@gmail.com> wrote:
Isn't "Either" the same thing as AorB in
data AorB = Aconstructor Int | Bconstructor Int
I want two separate types A and B along with a third type which is their Union. Is that not possible?
That's exactly what either is:
data A = ... data B = ...
f :: Int -> Either A B
In my actual case, I have more than two types. So I would like a way to take the union of an arbitrarily number of types.
data Union = A1 | A2 | ...
where each of A1, A2, ... has its own data declaration.
You can create a new data type:
data MyUnion = First A1 | Second A2 | Third A3
and use it like this:
f :: Int -> MyUnion