{-# LANGUAGE DataKinds, TypeFamilies #-} module M where data Tag = A | B | C data STag tag where SA :: STag A SB :: STag B SC :: STag C type family Fam tag where Fam A = Int Fam _ = Bool foo :: STag tag -> Fam tag foo SA = 42 :: Int foo _ = True :: Bool