{-# LANGUAGE EmptyDataDecls        #-}
{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE KindSignatures        #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module VarTypes where

import Generics.MultiRec.TH

data Type1 a b = CA a | CB b
data Type2 c   = CC c | CD
data Type3     = CE

data TypesF :: * -> * -> * -> * -> * where
  Type1 :: TypesF a b c (Type1 a b)
  Type2 :: TypesF a b c (Type2 c)
  Type3 :: TypesF a b c  Type3

$(deriveAll ''TypesF)