Brian Troutwine wrote:
Do you have any reason not to do the above?

Yes, the subset types that I wish to define are not clean partitions,
though my example does suggest this. Let's say that the definition of
Foo is now

  data Foo = One | Two | Three | Four | Five | Six

while Odd and Even remain the same. I would further like to define
Triangular, which I will do incorrectly for consistency.

  data Triangular = One | Three | Six

I could not accommodate this definition using your scheme, correct?


A variation on scheme proposed by Ross Mellgren earlier in this thread.
It's a bit tedious but allows for definition of arbitrary subsets thus it may work for you:

{-# LANGUAGE GADTs, EmptyDataDecls  #-}

data One
data Two
data Three
data Four

data Foo a where
    FOne :: Foo One
    FTwo :: Foo Two
    FThree :: Foo Three
    FFour :: Foo Four


class IsEven a
instance IsEven Two
instance IsEven Four

class IsOdd a
instance IsOdd One
instance IsOdd Three

class IsLessThanThree a
instance IsLessThanThree One
instance IsLessThanThree Two

quux :: IsEven a => Foo a -> String
quux FTwo = "2"
quux FFour = "4"

bzzt :: IsLessThanThree a => Foo a -> String
bzzt FOne = "1"
bzzt FTwo = "2"




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

Reply via email to