-}
type HomoFuncConstraint (n :: Nat) a = (HomoArgFuncConstraint n a, ResultT n a ~ IndexT 0 a)

{-|
Like 'HomoFuncConstraint', but only constrains all the arguments to be the same type, not the result.
-}
type family HomoArgFuncConstraint (n :: Nat) a :: Constraint
type instance HomoArgFuncConstraint 0 a = (FuncConstraint 0 a)
type instance HomoArgFuncConstraint 1 a = (FuncConstraint 1 a)
type instance HomoArgFuncConstraint 2 a = (FuncConstraint 2 a, IndexT 0 a ~ IndexT 1 a)