diff options
Diffstat (limited to 'testsuite/tests/gadt/set.hs')
-rw-r--r-- | testsuite/tests/gadt/set.hs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/testsuite/tests/gadt/set.hs b/testsuite/tests/gadt/set.hs new file mode 100644 index 0000000000..3a78bbb64b --- /dev/null +++ b/testsuite/tests/gadt/set.hs @@ -0,0 +1,45 @@ +{-# 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) + |