-- See Note [The Implicit Parameter class]
ipTyCon :: TyCon
ipTyCon = mkClassTyCon ipTyConName kind [ip,a] [] rhs ipClass NonRecursive
                       (mkPrelTyConRepName ipTyConName)
  where
    kind = mkArrowKinds [typeSymbolKind, liftedTypeKind] constraintKind
    [ip,a] = mkTemplateTyVars [typeSymbolKind, liftedTypeKind]
    rhs = NewTyCon ipDataCon (mkTyVarTy a) ([], mkTyVarTy a) ipCoAxiom
ipTyCon :: TyCon
ipTyCon = mkClassTyCon ipTyConName kind [ip,a] [] rhs ipClass NonRecursive
                       (mkPrelTyConRepName ipTyConName)
  where
    kind = mkArrowKinds [typeSymbolKind, liftedTypeKind] constraintKind
    [ip,a] = mkTemplateTyVars [typeSymbolKind, liftedTypeKind]
    rhs = NewTyCon ipDataCon (mkTyVarTy a) ([], mkTyVarTy a) ipCoAxiom
ipTyCon = mkClassTyCon ipTyConName kind [ip,a] [] rhs ipClass NonRecursive
                       (mkPrelTyConRepName ipTyConName)
  where
    kind = mkArrowKinds [typeSymbolKind, liftedTypeKind] constraintKind
    [ip,a] = mkTemplateTyVars [typeSymbolKind, liftedTypeKind]
    rhs = NewTyCon ipDataCon (mkTyVarTy a) ([], mkTyVarTy a) ipCoAxiom