[Haskell-cafe] Type system trickery

Niklas Broberg niklas.broberg at gmail.com
Sun Jun 21 15:55:23 EDT 2009


On Sun, Jun 21, 2009 at 9:24 PM, Andrew
Coppin<andrewcoppin at btinternet.com> wrote:
> I have a datatype with about a dozen constructors. I'd like to find a way to
> use the type system to prevent one of the constructors from being used in
> certain places. But I can't think of a way to do that.
>
>  data Foobar =
>   Foo Foobar |
>   Bar Foobar |
>   Zoo Foobar
>
> I want the type system to track whether or not Zoo has been used in a
> specific value. Sure, you can check for it at runtime, but I'd be happier if
> the type system can guarantee its absence when required.

That's what GADTs are for:

data Flag = HasZoo | NoZoo

data Foobar a where
  Foo :: Foobar a -> Foobar a
  Bar :: Foobar a -> Foobar a
  Zoo :: Foobar a -> Foobar HasZoo

f :: Foobar NoZoo -> Int
f foobar = ... -- foobar cannot be Zoo here

Cheers,

/Niklas


More information about the Haskell-Cafe mailing list