I've seen this expressed with GADTs (which I guess many things can), though I'm not sure if it's the best way, and I'm no type system wizard. If I recall correctly, this use is normally called phantom types.

{-# LANGUAGE EmptyDataDecls, GADTs #-}

data Even
data Odd

data Foo a where
    One :: Foo Odd
    Two :: Foo Even
    Three :: Foo Odd
    Four :: Foo Even

Then you can write functions that accept only evens:

f :: Foo Even -> ...

or only odds:

f :: Foo Odd -> ...

or either:

f :: Foo a -> ...

Hope that helps,

-Ross

On Jul 27, 2009, at 12:01 AM, Brian Troutwine wrote:

Hello all.

I would like to define a data type that is the super-set of several
types and then each of the proper subset types. For example:

  data Foo = One | Two | Three | Four
  data Odd = One | Three
  data Even = Two | Four

This, of course, does not work. It seems that such a thing should
possible to express entirely in the type system, but I cannot think of
how. Would someone be so kind as to explain how this sort of thing can
be accomplished?

Thanks,
Brian
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to