content: {-# LANGUAGE GADTs #-}
  
  -- Provoked by
  -- http://www.haskell.org/pipermail/haskell-cafe/2007-January/021086.html
  
  module ShouldCompile where
  
  import Data.Set as Set
  
  data Teq a b where Teq :: Teq a a
  
  ---------------------
  data SetM1 a where
       SM1 :: Ord w => Teq w a -> Set.Set w -> SetM1 a
  
  unionA1 :: SetM1 a -> SetM1 a -> SetM1 a
  unionA1 (SM1 Teq m1) (SM1 Teq m2)
    = SM1 Teq (m1 `Set.union` m2)
  
  unionB1 :: SetM1 a -> SetM1 a -> SetM1 a
  unionB1 (SM1 p1 m1) (SM1 p2 m2)
    = case p1 of Teq -> case p2 of Teq -> SM1 Teq (m1 `Set.union` m2)
  
  unionC1 :: SetM1 a -> SetM1 a -> SetM1 a
  unionC1 (SM1 p1 m1) (SM1 p2 m2)
    = case (p1,p2) of (Teq,Teq) -> SM1 Teq (m1 `Set.union` m2)
  
  
  ---------------------
  data SetM2 a where
       SM2 :: Ord w => Teq a w -> Set.Set w -> SetM2 a
          -- Different order of args in Teq
  
  unionA2 :: SetM2 a -> SetM2 a -> SetM2 a
  unionA2 (SM2 Teq m1) (SM2 Teq m2)
    = SM2 Teq (m1 `Set.union` m2)
  
  unionB2 :: SetM2 a -> SetM2 a -> SetM2 a
  unionB2 (SM2 p1 m1) (SM2 p2 m2)
    = case p1 of Teq -> case p2 of Teq -> SM2 Teq (m1 `Set.union` m2)
  
  unionC2 :: SetM2 a -> SetM2 a -> SetM2 a
  unionC2 (SM2 p1 m1) (SM2 p2 m2)
    = case (p1,p2) of (Teq,Teq) -> SM2 Teq (m1 `Set.union` m2)
  
  