{-# LANGUAGE DataKinds, TypeFamilies, AllowAmbiguousTypes, UndecidableInstances #-} import Data.Kind main :: IO () main = do print (check @[Bool, Int]) -- print (check @[Float, Bool, Int]) check :: forall xs. Extendss Proxy xs => () check = () type SeqConstraintUnit :: Constraint -> Constraint -> Constraint type family SeqConstraintUnit a b where SeqConstraintUnit () x = x type Extendss :: ([Type] -> Type) -> [Type] -> Constraint type family Extendss p xs where Extendss p '[] = () Extendss p (x : xs) = (Extends p x `SeqConstraintUnit` Extendss p xs) type Extends :: ([Type] -> Type) -> Type -> Constraint type family Extends a b data Proxy a = P type instance Extends Proxy Bool = () type instance Extends Proxy Int = ()