{-# LANGUAGE GADTs , PolyKinds #-} module Bug2 where import Unsafe.Coerce data TyConT (a::k) = TyConT String eqTyConT :: TyConT a -> TyConT b -> Bool eqTyConT (TyConT a) (TyConT b) = a == b tyConTArr :: TyConT (->) tyConTArr = TyConT "(->)" data TypeRepT (a::k) where TRCon :: TyConT a -> TypeRepT a TRApp :: TypeRepT a -> TypeRepT b -> TypeRepT (a b) data GetAppT a where GA :: TypeRepT a -> TypeRepT b -> GetAppT (a b) getAppT :: TypeRepT a -> Maybe (GetAppT a) getAppT (TRApp a b) = Just $ GA a b getAppT _ = Nothing eqTT :: TypeRepT (a::k1) -> TypeRepT (b::k2) -> Bool eqTT (TRCon a) (TRCon b) = eqTyConT a b eqTT (TRApp c a) (TRApp d b) = eqTT c d && eqTT a b eqTT _ _ = False data G2 c a where G2 :: TypeRepT a -> TypeRepT b -> G2 c (c a b) getT2 :: TypeRepT (c :: k2 -> k1 -> k) -> TypeRepT (a :: k) -> Maybe (G2 c a) getT2 c t = do GA t' b <- getAppT t GA c' a <- getAppT t' if eqTT c c' then Just (unsafeCoerce $ G2 a b :: G2 c a) else Nothing tyRepTArr :: TypeRepT (->) tyRepTArr = TRCon tyConTArr s tf = case getT2 tyRepTArr tf of Just (G2 _ _) -> Nothing _ -> Nothing