
I would expect foo r@(Range BITSTRING _ _) x = [] to give an error but it doesn't. Writing t = Range BITSTRING gives one so why not the pattern match? Dom. data BitString = BitString [Bool] deriving Show data ConstrainedType :: * -> * where INTEGER :: ConstrainedType Int BITSTRING :: ConstrainedType BitString Seq :: ConstrainedType a -> ConstrainedType b -> ConstrainedType (a,b) Range :: Ord a => ConstrainedType a -> a -> a -> ConstrainedType a foo :: ConstrainedType a -> a -> [Int] foo BITSTRING (BitString x) = map fromEnum x foo INTEGER x = [x] foo r@(Range INTEGER _ _) x = [upperInt r,x] foo r@(Range BITSTRING _ _) x = [] r1 = Range INTEGER 20 40 r2 = Range r1 25 45 upperInt :: ConstrainedType Int -> Int upperInt INTEGER = 256 upperInt (Range t l u) = min u (upperInt t)