tcSplitRhoTy,
tcInstTyVar, tcInstTyVars,
- tcInstSigVar,
+ tcInstSigVars,
tcInstType,
--------------------------------
in
tcNewMutTyVar name (tyVarKind tyvar)
-tcInstSigVar tyvar -- Very similar to tcInstTyVar
- = tcGetUnique `thenNF_Tc` \ uniq ->
- let
- name = setNameUnique (tyVarName tyvar) uniq
- kind = tyVarKind tyvar
- in
- ASSERT( not (kind == openTypeKind) ) -- Shouldn't happen
- tcNewSigTyVar name kind
+tcInstSigVars tyvars -- Very similar to tcInstTyVar
+ = tcGetUniques `thenNF_Tc` \ uniqs ->
+ listTc [ ASSERT( not (kind == openTypeKind) ) -- Shouldn't happen
+ tcNewSigTyVar name kind
+ | (tyvar, uniq) <- tyvars `zip` uniqs,
+ let name = setNameUnique (tyVarName tyvar) uniq,
+ let kind = tyVarKind tyvar
+ ]
\end{code}
@tcInstType@ instantiates the outer-level for-alls of a TcType with
tcInstType :: TcType -> NF_TcM ([TcTyVar], TcThetaType, TcType)
tcInstType ty
= case splitForAllTys ty of
- ([], _) -> returnNF_Tc ([], [], ty) -- Nothing to do
+ ([], rho) -> -- There may be overloading but no type variables;
+ -- (?x :: Int) => Int -> Int
+ tcSplitRhoTy rho `thenNF_Tc` \ (theta, tau) ->
+ returnNF_Tc ([], theta, tau)
+
(tyvars, rho) -> tcInstTyVars tyvars `thenNF_Tc` \ (tyvars', _, tenv) ->
tcSplitRhoTy (substTy tenv rho) `thenNF_Tc` \ (theta, tau) ->
returnNF_Tc (tyvars', theta, tau)