coercibleTyCon :: TyCon
coercibleTyCon = mkClassTyCon coercibleTyConName kind tvs
                              [Nominal, Representational, Representational]
                              rhs coercibleClass NonRecursive
                              (mkPrelTyConRepName coercibleTyConName)
  where
     kind = (ForAllTy kv $ mkArrowKinds [k, k] constraintKind)
     kv = kKiVar
     k = mkTyVarTy kv
     [a,b] = mkTemplateTyVars [k,k]
     tvs = [kv, a, b]
     rhs = DataTyCon [coercibleDataCon] False
coercibleTyCon :: TyCon
coercibleTyCon = mkClassTyCon coercibleTyConName kind tvs
                              [Nominal, Representational, Representational]
                              rhs coercibleClass NonRecursive
                              (mkPrelTyConRepName coercibleTyConName)
  where
     kind = (ForAllTy kv $ mkArrowKinds [k, k] constraintKind)
     kv = kKiVar
     k = mkTyVarTy kv
     [a,b] = mkTemplateTyVars [k,k]
     tvs = [kv, a, b]
     rhs = DataTyCon [coercibleDataCon] False
coercibleTyCon = mkClassTyCon coercibleTyConName kind tvs
                              [Nominal, Representational, Representational]
                              rhs coercibleClass NonRecursive
                              (mkPrelTyConRepName coercibleTyConName)
  where
     kind = (ForAllTy kv $ mkArrowKinds [k, k] constraintKind)
     kv = kKiVar
     k = mkTyVarTy kv
     [a,b] = mkTemplateTyVars [k,k]
     tvs = [kv, a, b]
     rhs = DataTyCon [coercibleDataCon] False