Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1930

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>typecheck/TcHsType.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[TcMonoType]{Typechecking user-specified @MonoTypes@}

\begin{code}
<pre><a name="line-1"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>TcHsType</span> <span class='hs-layout'>(</span>
<a name="line-2"></a>	<span class='hs-varid'>tcHsSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsSigTypeNC</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsDeriv</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>	<span class='hs-varid'>tcHsInstHead</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsQuantifiedType</span><span class='hs-layout'>,</span>
<a name="line-4"></a>	<span class='hs-conid'>UserTypeCtxt</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-5"></a>
<a name="line-6"></a>		<span class='hs-comment'>-- Kind checking</span>
<a name="line-7"></a>	<span class='hs-varid'>kcHsTyVars</span><span class='hs-layout'>,</span> <span class='hs-varid'>kcHsSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>kcHsLiftedSigType</span><span class='hs-layout'>,</span> 
<a name="line-8"></a>	<span class='hs-varid'>kcLHsType</span><span class='hs-layout'>,</span> <span class='hs-varid'>kcCheckLHsType</span><span class='hs-layout'>,</span> <span class='hs-varid'>kcHsContext</span><span class='hs-layout'>,</span> 
<a name="line-9"></a>	
<a name="line-10"></a>		<span class='hs-comment'>-- Typechecking kinded types</span>
<a name="line-11"></a>	<span class='hs-varid'>tcHsKindedContext</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsKindedType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsBangType</span><span class='hs-layout'>,</span>
<a name="line-12"></a>	<span class='hs-varid'>tcTyVarBndrs</span><span class='hs-layout'>,</span> <span class='hs-varid'>dsHsType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcLHsConResTy</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	<span class='hs-varid'>tcDataKindSig</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExpKind</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>EkCtxt</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-14"></a>
<a name="line-15"></a>		<span class='hs-comment'>-- Pattern type signatures</span>
<a name="line-16"></a>	<span class='hs-varid'>tcHsPatSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcPatSig</span>
<a name="line-17"></a>   <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-18"></a>
<a name="line-19"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-cpp'>#ifdef GHCI 	/* Only if bootstrapped */</span>
<a name="line-22"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span>	<span class='hs-conid'>TcSplice</span><span class='hs-layout'>(</span> <span class='hs-varid'>kcSpliceType</span> <span class='hs-layout'>)</span>
<a name="line-23"></a><span class='hs-cpp'>#endif</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-26"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RnHsSyn</span>
<a name="line-27"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>
<a name="line-28"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcEnv</span>
<a name="line-29"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcMType</span>
<a name="line-30"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcUnify</span>
<a name="line-31"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcIface</span>
<a name="line-32"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcType</span>
<a name="line-33"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{- Kind parts of -}</span> <span class='hs-conid'>Type</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>
<a name="line-35"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarSet</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Coercion</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameSet</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TysWiredIn</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>
<a name="line-44"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Util</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
</pre>\end{code}


	----------------------------
		General notes
	----------------------------

Generally speaking we now type-check types in three phases

  1.  kcHsType: kind check the HsType
	*includes* performing any TH type splices;
	so it returns a translated, and kind-annotated, type

  2.  dsHsType: convert from HsType to Type:
	perform zonking
	expand type synonyms [mkGenTyApps]
	hoist the foralls [tcHsType]

  3.  checkValidType: check the validity of the resulting type

Often these steps are done one after the other (tcHsSigType).
But in mutually recursive groups of type and class decls we do
	1 kind-check the whole group
	2 build TyCons/Classes in a knot-tied way
	3 check the validity of types in the now-unknotted TyCons/Classes

For example, when we find
	(forall a m. m a -> m a)
we bind a,m to kind varibles and kind-check (m a -> m a).  This makes
a get kind *, and m get kind *->*.  Now we typecheck (m a -> m a) in
an environment that binds a and m suitably.

The kind checker passed to tcHsTyVars needs to look at enough to
establish the kind of the tyvar:
  * For a group of type and class decls, it's just the group, not
	the rest of the program
  * For a tyvar bound in a pattern type signature, its the types
	mentioned in the other type signatures in that bunch of patterns
  * For a tyvar bound in a RULE, it's the type signatures on other
	universally quantified variables in the rule

Note that this may occasionally give surprising results.  For example:

	data T a b = MkT (a b)

Here we deduce			a::*->*,       b::*
But equally valid would be	a::(*->*)-> *, b::*->*


Validity checking
~~~~~~~~~~~~~~~~~
Some of the validity check could in principle be done by the kind checker, 
but not all:

- During desugaring, we normalise by expanding type synonyms.  Only
  after this step can we check things like type-synonym saturation
  e.g. 	type T k = k Int
	type S a = a
  Then (T S) is ok, because T is saturated; (T S) expands to (S Int);
  and then S is saturated.  This is a GHC extension.

- Similarly, also a GHC extension, we look through synonyms before complaining
  about the form of a class or instance declaration

- Ambiguity checks involve functional dependencies, and it's easier to wait
  until knots have been resolved before poking into them

Also, in a mutually recursive group of types, we can't look at the TyCon until we've
finished building the loop.  So to keep things simple, we postpone most validity
checking until step (3).

Knot tying
~~~~~~~~~~
During step (1) we might fault in a TyCon defined in another module, and it might
(via a loop) refer back to a TyCon defined in this module. So when we tie a big
knot around type declarations with ARecThing, so that the fault-in code can get
the TyCon being defined.


%************************************************************************
%*									*
\subsection{Checking types}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="tcHsSigType"></a><span class='hs-definition'>tcHsSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcHsSigTypeNC</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UserTypeCtxt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-2"></a>  <span class='hs-comment'>-- Do kind checking, and hoist for-alls to the top</span>
<a name="line-3"></a>  <span class='hs-comment'>-- NB: it's important that the foralls that come from the top-level</span>
<a name="line-4"></a>  <span class='hs-comment'>--	 HsForAllTy in hs_ty occur *first* in the returned type.</span>
<a name="line-5"></a>  <span class='hs-comment'>--     See Note [Scoped] with TcSigInfo</span>
<a name="line-6"></a><span class='hs-definition'>tcHsSigType</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span> 
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErrCtxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprHsSigCtxt</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-8"></a>    <span class='hs-varid'>tcHsSigTypeNC</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="tcHsSigTypeNC"></a><span class='hs-definition'>tcHsSigTypeNC</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>kinded_ty</span><span class='hs-layout'>,</span> <span class='hs-sel'>_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>hs_ty</span>
<a name="line-12"></a>    	  <span class='hs-comment'>-- The kind is checked by checkValidType, and isn't necessarily</span>
<a name="line-13"></a>	  <span class='hs-comment'>-- of kind * in a Template Haskell quote eg [t| Maybe |]</span>
<a name="line-14"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsKindedType</span> <span class='hs-varid'>kinded_ty</span>
<a name="line-15"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkValidType</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>ty</span>	
<a name="line-16"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>}</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="tcHsInstHead"></a><span class='hs-definition'>tcHsInstHead</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>ThetaType</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-19"></a><span class='hs-comment'>-- Typecheck an instance head.  We can't use </span>
<a name="line-20"></a><span class='hs-comment'>-- tcHsSigType, because it's not a valid user type.</span>
<a name="line-21"></a><span class='hs-definition'>tcHsInstHead</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-22"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>loc</span>   <span class='hs-varop'>$</span>	<span class='hs-comment'>-- No need for an "In the type..." context</span>
<a name="line-23"></a>    <span class='hs-varid'>tc_inst_head</span> <span class='hs-varid'>ty</span>     <span class='hs-comment'>-- because that comes from the caller</span>
<a name="line-24"></a>  <span class='hs-keyword'>where</span>
<a name="line-25"></a>    <span class='hs-comment'>-- tc_inst_head expects HsPredTy, which isn't usually even allowed</span>
<a name="line-26"></a>    <span class='hs-varid'>tc_inst_head</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-27"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>pred'</span>  <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcHsPred</span> <span class='hs-varid'>pred</span>
<a name="line-28"></a>    	   <span class='hs-layout'>;</span> <span class='hs-varid'>pred''</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsPred</span> <span class='hs-varid'>pred'</span>
<a name="line-29"></a>           <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred''</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-30"></a>
<a name="line-31"></a>    <span class='hs-varid'>tc_inst_head</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>ctxt</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-32"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kcHsTyVars</span> <span class='hs-varid'>tvs</span>    <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tvs'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-33"></a>    	<span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ctxt'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcHsContext</span> <span class='hs-varid'>ctxt</span>
<a name="line-34"></a>    	   <span class='hs-layout'>;</span> <span class='hs-varid'>pred'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcHsPred</span>    <span class='hs-varid'>pred</span>
<a name="line-35"></a>    	   <span class='hs-layout'>;</span> <span class='hs-varid'>tcTyVarBndrs</span> <span class='hs-varid'>tvs'</span>  <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tvs''</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-36"></a>    	<span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ctxt''</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>dsHsLPred</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ctxt'</span><span class='hs-layout'>)</span>
<a name="line-37"></a>    	   <span class='hs-layout'>;</span> <span class='hs-varid'>pred''</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsPred</span> <span class='hs-varid'>pred'</span>
<a name="line-38"></a>    	   <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs''</span><span class='hs-layout'>,</span> <span class='hs-varid'>ctxt''</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred''</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-39"></a>
<a name="line-40"></a>    <span class='hs-varid'>tc_inst_head</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Malformed instance type"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a><a name="tcHsQuantifiedType"></a><span class='hs-definition'>tcHsQuantifiedType</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Type</span><span class='hs-layout'>)</span>
<a name="line-43"></a><span class='hs-comment'>-- Behave very like type-checking (HsForAllTy sig_tvs hs_ty),</span>
<a name="line-44"></a><span class='hs-comment'>-- except that we want to keep the tvs separate</span>
<a name="line-45"></a><span class='hs-definition'>tcHsQuantifiedType</span> <span class='hs-varid'>tv_names</span> <span class='hs-varid'>hs_ty</span>
<a name="line-46"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kcHsTyVars</span> <span class='hs-varid'>tv_names</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tv_names'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-47"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>kc_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcHsSigType</span> <span class='hs-varid'>hs_ty</span>
<a name="line-48"></a>    	<span class='hs-layout'>;</span> <span class='hs-varid'>tcTyVarBndrs</span> <span class='hs-varid'>tv_names'</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tvs</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-49"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>kc_ty</span>
<a name="line-50"></a>    	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="tcHsDeriv"></a><span class='hs-comment'>-- Used for the deriving(...) items</span>
<a name="line-53"></a><span class='hs-definition'>tcHsDeriv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Class</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-54"></a><span class='hs-definition'>tcHsDeriv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc_hs_deriv</span> <span class='hs-conid'>[]</span>
<a name="line-55"></a>
<a name="line-56"></a><a name="tc_hs_deriv"></a><span class='hs-definition'>tc_hs_deriv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span>
<a name="line-57"></a>            <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>Class</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-58"></a><span class='hs-definition'>tc_hs_deriv</span> <span class='hs-varid'>tv_names</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsClassP</span> <span class='hs-varid'>cls_name</span> <span class='hs-varid'>hs_tys</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-59"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kcHsTyVars</span> <span class='hs-varid'>tv_names</span> 		<span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tv_names'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-60"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>cls_kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcClass</span> <span class='hs-varid'>cls_name</span>
<a name="line-61"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tys</span><span class='hs-layout'>,</span> <span class='hs-sel'>_res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcApps</span> <span class='hs-varid'>cls_name</span> <span class='hs-varid'>cls_kind</span> <span class='hs-varid'>hs_tys</span>
<a name="line-62"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>tcTyVarBndrs</span> <span class='hs-varid'>tv_names'</span>	<span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-63"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsTypes</span> <span class='hs-varid'>tys</span>
<a name="line-64"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>cls</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupClass</span> <span class='hs-varid'>cls_name</span>
<a name="line-65"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>cls</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span><span class='hs-layout'>}</span>
<a name="line-66"></a>
<a name="line-67"></a><span class='hs-definition'>tc_hs_deriv</span> <span class='hs-varid'>tv_names1</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tv_names2</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-68"></a>  <span class='hs-keyglyph'>=</span> 	<span class='hs-comment'>-- Funny newtype deriving form</span>
<a name="line-69"></a>	<span class='hs-comment'>-- 	forall a. C [a]</span>
<a name="line-70"></a>	<span class='hs-comment'>-- where C has arity 2.  Hence can't use regular functions</span>
<a name="line-71"></a>    <span class='hs-varid'>tc_hs_deriv</span> <span class='hs-layout'>(</span><span class='hs-varid'>tv_names1</span> <span class='hs-varop'>++</span> <span class='hs-varid'>tv_names2</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-definition'>tc_hs_deriv</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>other</span>
<a name="line-74"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Illegal deriving item"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
</pre>\end{code}

	These functions are used during knot-tying in
	type and class declarations, when we have to
 	separate kind-checking, desugaring, and validity checking

\begin{code}
<pre><a name="line-1"></a><a name="kcHsSigType"></a><span class='hs-definition'>kcHsSigType</span><span class='hs-layout'>,</span> <span class='hs-varid'>kcHsLiftedSigType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-2"></a>	<span class='hs-comment'>-- Used for type signatures</span>
<a name="line-3"></a><span class='hs-definition'>kcHsSigType</span> <span class='hs-varid'>ty</span> 	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addKcTypeCtxt</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>$</span> <span class='hs-varid'>kcTypeType</span> <span class='hs-varid'>ty</span>
<a name="line-4"></a><a name="kcHsLiftedSigType"></a><span class='hs-definition'>kcHsLiftedSigType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addKcTypeCtxt</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>$</span> <span class='hs-varid'>kcLiftedType</span> <span class='hs-varid'>ty</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="tcHsKindedType"></a><span class='hs-definition'>tcHsKindedType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-7"></a>  <span class='hs-comment'>-- Don't do kind checking, nor validity checking.</span>
<a name="line-8"></a>  <span class='hs-comment'>-- This is used in type and class decls, where kinding is</span>
<a name="line-9"></a>  <span class='hs-comment'>-- done in advance, and validity checking is done later</span>
<a name="line-10"></a>  <span class='hs-comment'>-- [Validity checking done later because of knot-tying issues.]</span>
<a name="line-11"></a><span class='hs-definition'>tcHsKindedType</span> <span class='hs-varid'>hs_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>hs_ty</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="tcHsBangType"></a><span class='hs-definition'>tcHsBangType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-14"></a><span class='hs-comment'>-- Permit a bang, but discard it</span>
<a name="line-15"></a><span class='hs-definition'>tcHsBangType</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsBangTy</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcHsKindedType</span> <span class='hs-varid'>ty</span>
<a name="line-16"></a><span class='hs-definition'>tcHsBangType</span> <span class='hs-varid'>ty</span>                    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcHsKindedType</span> <span class='hs-varid'>ty</span>
<a name="line-17"></a>
<a name="line-18"></a><a name="tcHsKindedContext"></a><span class='hs-definition'>tcHsKindedContext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsContext</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>ThetaType</span>
<a name="line-19"></a><span class='hs-comment'>-- Used when we are expecting a ClassContext (i.e. no implicit params)</span>
<a name="line-20"></a><span class='hs-comment'>-- Does not do validity checking, like tcHsKindedType</span>
<a name="line-21"></a><span class='hs-definition'>tcHsKindedContext</span> <span class='hs-varid'>hs_theta</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addLocM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapM</span> <span class='hs-varid'>dsHsLPred</span><span class='hs-layout'>)</span> <span class='hs-varid'>hs_theta</span>
</pre>\end{code}


%************************************************************************
%*									*
		The main kind checker: kcHsType
%*									*
%************************************************************************
	
	First a couple of simple wrappers for kcHsType

\begin{code}
<pre><a name="line-1"></a><a name="kcLiftedType"></a><span class='hs-comment'>---------------------------</span>
<a name="line-2"></a><span class='hs-definition'>kcLiftedType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-3"></a><span class='hs-comment'>-- The type ty must be a *lifted* *type*</span>
<a name="line-4"></a><span class='hs-definition'>kcLiftedType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>ekLifted</span>
<a name="line-5"></a>    
<a name="line-6"></a><a name="kcTypeType"></a><span class='hs-comment'>---------------------------</span>
<a name="line-7"></a><span class='hs-definition'>kcTypeType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-8"></a><span class='hs-comment'>-- The type ty must be a *type*, but it can be lifted or </span>
<a name="line-9"></a><span class='hs-comment'>-- unlifted or an unboxed tuple.</span>
<a name="line-10"></a><span class='hs-definition'>kcTypeType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>ekOpen</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="kcCheckLHsType"></a><span class='hs-comment'>---------------------------</span>
<a name="line-13"></a><span class='hs-definition'>kcCheckLHsType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-14"></a><span class='hs-definition'>kcCheckLHsType</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addKcTypeCtxt</span> <span class='hs-varid'>ty</span> <span class='hs-varop'>$</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>kind</span>
<a name="line-15"></a>
<a name="line-16"></a>
<a name="line-17"></a><a name="kc_check_lhs_type"></a><span class='hs-definition'>kc_check_lhs_type</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-18"></a><span class='hs-comment'>-- Check that the type has the specified kind</span>
<a name="line-19"></a><span class='hs-comment'>-- Be sure to use checkExpectedKind, rather than simply unifying </span>
<a name="line-20"></a><span class='hs-comment'>-- with OpenTypeKind, because it gives better error messages</span>
<a name="line-21"></a><span class='hs-definition'>kc_check_lhs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>exp_kind</span> 
<a name="line-22"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>span</span> <span class='hs-varop'>$</span>
<a name="line-23"></a>    <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_check_hs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>exp_kind</span>
<a name="line-24"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="kc_check_lhs_types"></a><span class='hs-definition'>kc_check_lhs_types</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExpKind</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-27"></a><span class='hs-definition'>kc_check_lhs_types</span> <span class='hs-varid'>tys_w_kinds</span>
<a name="line-28"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>kc_arg</span> <span class='hs-varid'>tys_w_kinds</span>
<a name="line-29"></a>  <span class='hs-keyword'>where</span>
<a name="line-30"></a>    <span class='hs-varid'>kc_arg</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>arg</span> <span class='hs-varid'>arg_kind</span>
<a name="line-31"></a>
<a name="line-32"></a>
<a name="line-33"></a><a name="kc_check_hs_type"></a><span class='hs-comment'>---------------------------</span>
<a name="line-34"></a><span class='hs-definition'>kc_check_hs_type</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-35"></a>
<a name="line-36"></a><span class='hs-comment'>-- First some special cases for better error messages </span>
<a name="line-37"></a><span class='hs-comment'>-- when we know the expected kind</span>
<a name="line-38"></a><span class='hs-definition'>kc_check_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>exp_kind</span>
<a name="line-39"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>exp_kind</span><span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-definition'>kc_check_hs_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-varid'>exp_kind</span>
<a name="line-42"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>fun_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitHsAppTys</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-43"></a>       <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>fun_ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fun_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>fun_ty</span>
<a name="line-44"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>arg_tys'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcCheckApps</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>arg_tys</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>exp_kind</span>
<a name="line-45"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkHsAppTys</span> <span class='hs-varid'>fun_ty'</span> <span class='hs-varid'>arg_tys'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-46"></a>
<a name="line-47"></a><span class='hs-comment'>-- This is the general case: infer the kind and compare</span>
<a name="line-48"></a><span class='hs-definition'>kc_check_hs_type</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>exp_kind</span>
<a name="line-49"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>act_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_hs_type</span> <span class='hs-varid'>ty</span>
<a name="line-50"></a>		<span class='hs-comment'>-- Add the context round the inner check only</span>
<a name="line-51"></a>		<span class='hs-comment'>-- because checkExpectedKind already mentions</span>
<a name="line-52"></a>		<span class='hs-comment'>-- 'ty' by name in any error message</span>
<a name="line-53"></a>
<a name="line-54"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkExpectedKind</span> <span class='hs-layout'>(</span><span class='hs-varid'>strip</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>act_kind</span> <span class='hs-varid'>exp_kind</span>
<a name="line-55"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ty'</span> <span class='hs-layout'>}</span>
<a name="line-56"></a>  <span class='hs-keyword'>where</span>
<a name="line-57"></a>	<span class='hs-comment'>-- We infer the kind of the type, and then complain if it's</span>
<a name="line-58"></a>	<span class='hs-comment'>-- not right.  But we don't want to complain about</span>
<a name="line-59"></a>	<span class='hs-comment'>--	(ty) or !(ty) or forall a. ty</span>
<a name="line-60"></a>	<span class='hs-comment'>-- when the real difficulty is with the 'ty' part.</span>
<a name="line-61"></a>    <span class='hs-varid'>strip</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>          <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strip</span> <span class='hs-varid'>ty</span>
<a name="line-62"></a>    <span class='hs-varid'>strip</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsBangTy</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strip</span> <span class='hs-varid'>ty</span>
<a name="line-63"></a>    <span class='hs-varid'>strip</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>strip</span> <span class='hs-varid'>ty</span>
<a name="line-64"></a>    <span class='hs-varid'>strip</span> <span class='hs-varid'>ty</span>			      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ty</span>
</pre>\end{code}

	Here comes the main function

\begin{code}
<pre><a name="line-1"></a><a name="kcLHsType"></a><span class='hs-definition'>kcLHsType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-comment'>-- Called from outside: set the context</span>
<a name="line-3"></a><span class='hs-definition'>kcLHsType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addKcTypeCtxt</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="kc_lhs_type"></a><span class='hs-definition'>kc_lhs_type</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-6"></a><span class='hs-definition'>kc_lhs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>span</span> <span class='hs-varop'>$</span>
<a name="line-8"></a>    <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_hs_type</span> <span class='hs-varid'>ty</span>
<a name="line-9"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-10"></a>
<a name="line-11"></a><span class='hs-comment'>-- kc_hs_type *returns* the kind of the type, rather than taking an expected</span>
<a name="line-12"></a><span class='hs-comment'>-- kind as argument as tcExpr does.  </span>
<a name="line-13"></a><span class='hs-comment'>-- Reasons: </span>
<a name="line-14"></a><span class='hs-comment'>--	(a) the kind of (-&gt;) is</span>
<a name="line-15"></a><span class='hs-comment'>--		forall bx1 bx2. Type bx1 -&gt; Type bx2 -&gt; Type Boxed</span>
<a name="line-16"></a><span class='hs-comment'>--  	    so we'd need to generate huge numbers of bx variables.</span>
<a name="line-17"></a><span class='hs-comment'>--	(b) kinds are so simple that the error messages are fine</span>
<a name="line-18"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><span class='hs-comment'>-- The translated type has explicitly-kinded type-variable binders</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="kc_hs_type"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-22"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-23"></a>   <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty</span>
<a name="line-24"></a>   <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-27"></a>    <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcTyVar</span> <span class='hs-varid'>name</span>
<a name="line-28"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>name</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsListTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-31"></a>    <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcLiftedType</span> <span class='hs-varid'>ty</span>
<a name="line-32"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsListTy</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-33"></a>
<a name="line-34"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPArrTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-35"></a>    <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcLiftedType</span> <span class='hs-varid'>ty</span>
<a name="line-36"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPArrTy</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsNumTy</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-39"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsNumTy</span> <span class='hs-varid'>n</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsKindSig</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-42"></a>    <span class='hs-varid'>ty'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty</span> <span class='hs-layout'>(</span><span class='hs-conid'>EK</span> <span class='hs-varid'>k</span> <span class='hs-conid'>EkKindSig</span><span class='hs-layout'>)</span>
<a name="line-43"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsKindSig</span> <span class='hs-varid'>ty'</span> <span class='hs-varid'>k</span><span class='hs-layout'>,</span> <span class='hs-varid'>k</span><span class='hs-layout'>)</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-conid'>Boxed</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-46"></a>    <span class='hs-varid'>tys'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>kcLiftedType</span> <span class='hs-varid'>tys</span>
<a name="line-47"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-conid'>Boxed</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-48"></a>
<a name="line-49"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-conid'>Unboxed</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-50"></a>    <span class='hs-varid'>tys'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>kcTypeType</span> <span class='hs-varid'>tys</span>
<a name="line-51"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-conid'>Unboxed</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>ubxTupleKind</span><span class='hs-layout'>)</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFunTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-54"></a>    <span class='hs-varid'>ty1'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_check_lhs_type</span> <span class='hs-varid'>ty1</span> <span class='hs-layout'>(</span><span class='hs-conid'>EK</span> <span class='hs-varid'>argTypeKind</span> <span class='hs-conid'>EkUnk</span><span class='hs-layout'>)</span>
<a name="line-55"></a>    <span class='hs-varid'>ty2'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcTypeType</span> <span class='hs-varid'>ty2</span>
<a name="line-56"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFunTy</span> <span class='hs-varid'>ty1'</span> <span class='hs-varid'>ty2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-57"></a>
<a name="line-58"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-59"></a>    <span class='hs-varid'>op_kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>addLocM</span> <span class='hs-varid'>kcTyVar</span> <span class='hs-varid'>op</span>
<a name="line-60"></a>    <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-varid'>ty1'</span><span class='hs-layout'>,</span><span class='hs-varid'>ty2'</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcApps</span> <span class='hs-varid'>op</span> <span class='hs-varid'>op_kind</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ty1</span><span class='hs-layout'>,</span><span class='hs-varid'>ty2</span><span class='hs-keyglyph'>]</span>
<a name="line-61"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>ty1'</span> <span class='hs-varid'>op</span> <span class='hs-varid'>ty2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span>
<a name="line-62"></a>
<a name="line-63"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-64"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>fun_ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>fun_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>fun_ty</span>
<a name="line-65"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>arg_tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcApps</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>arg_tys</span>
<a name="line-66"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkHsAppTys</span> <span class='hs-varid'>fun_ty'</span> <span class='hs-varid'>arg_tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span>
<a name="line-67"></a>  <span class='hs-keyword'>where</span>
<a name="line-68"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>fun_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitHsAppTys</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span>
<a name="line-69"></a>
<a name="line-70"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-71"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrongPredErr</span> <span class='hs-varid'>pred</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>tv_names</span> <span class='hs-varid'>context</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-74"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kcHsTyVars</span> <span class='hs-varid'>tv_names</span>         <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tv_names'</span> <span class='hs-keyglyph'>-&gt;</span>
<a name="line-75"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>ctxt'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcHsContext</span> <span class='hs-varid'>context</span>
<a name="line-76"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>ty'</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcLiftedType</span> <span class='hs-varid'>ty</span>
<a name="line-77"></a>	     <span class='hs-comment'>-- The body of a forall is usually a type, but in principle</span>
<a name="line-78"></a>	     <span class='hs-comment'>-- there's no reason to prohibit *unlifted* types.</span>
<a name="line-79"></a>	     <span class='hs-comment'>-- In fact, GHC can itself construct a function with an</span>
<a name="line-80"></a>	     <span class='hs-comment'>-- unboxed tuple inside a for-all (via CPR analyis; see </span>
<a name="line-81"></a>	     <span class='hs-comment'>-- typecheck/should_compile/tc170)</span>
<a name="line-82"></a>	     <span class='hs-comment'>--</span>
<a name="line-83"></a>	     <span class='hs-comment'>-- Still, that's only for internal interfaces, which aren't</span>
<a name="line-84"></a>	     <span class='hs-comment'>-- kind-checked, so we only allow liftedTypeKind here</span>
<a name="line-85"></a>
<a name="line-86"></a>  	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-varid'>exp</span> <span class='hs-varid'>tv_names'</span> <span class='hs-varid'>ctxt'</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-87"></a>
<a name="line-88"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsBangTy</span> <span class='hs-varid'>b</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-89"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty</span>
<a name="line-90"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsBangTy</span> <span class='hs-varid'>b</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-91"></a>
<a name="line-92"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsRecTy</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-93"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Unexpected record type"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-94"></a>      <span class='hs-comment'>-- Record types (which only show up temporarily in constructor signatures) </span>
<a name="line-95"></a>      <span class='hs-comment'>-- should have been removed by now</span>
<a name="line-96"></a>
<a name="line-97"></a><span class='hs-cpp'>#ifdef GHCI	/* Only if bootstrapped */</span>
<a name="line-98"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTy</span> <span class='hs-varid'>sp</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kcSpliceType</span> <span class='hs-varid'>sp</span>
<a name="line-99"></a><span class='hs-cpp'>#else</span>
<a name="line-100"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Unexpected type splice:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-101"></a><span class='hs-cpp'>#endif</span>
<a name="line-102"></a>
<a name="line-103"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTyOut</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"kc_hs_type"</span>	<span class='hs-comment'>-- Should not happen at all</span>
<a name="line-104"></a>
<a name="line-105"></a><span class='hs-comment'>-- remove the doc nodes here, no need to worry about the location since</span>
<a name="line-106"></a><span class='hs-comment'>-- its the same for a doc node and it's child type node</span>
<a name="line-107"></a><span class='hs-definition'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsDocTy</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-108"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>kc_hs_type</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> 
<a name="line-109"></a>
<a name="line-110"></a><a name="kcApps"></a><span class='hs-comment'>---------------------------</span>
<a name="line-111"></a><span class='hs-definition'>kcApps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span>
<a name="line-112"></a>       <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> 
<a name="line-113"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcKind</span>			<span class='hs-comment'>-- Function kind</span>
<a name="line-114"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>		<span class='hs-comment'>-- Arg types</span>
<a name="line-115"></a>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>	<span class='hs-comment'>-- Kind-checked args</span>
<a name="line-116"></a><span class='hs-definition'>kcApps</span> <span class='hs-varid'>the_fun</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>args</span>
<a name="line-117"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>args_w_kinds</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>splitFunKind</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>the_fun</span><span class='hs-layout'>)</span> <span class='hs-num'>1</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>args</span>
<a name="line-118"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>args'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_check_lhs_types</span> <span class='hs-varid'>args_w_kinds</span>
<a name="line-119"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>args'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="kcCheckApps"></a><span class='hs-definition'>kcCheckApps</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-122"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span>     <span class='hs-comment'>-- The type being checked (for err messages only)</span>
<a name="line-123"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpKind</span> 	       <span class='hs-comment'>-- Expected kind</span>
<a name="line-124"></a>	    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>
<a name="line-125"></a><span class='hs-definition'>kcCheckApps</span> <span class='hs-varid'>the_fun</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>args</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>exp_kind</span>
<a name="line-126"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>args_w_kinds</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>splitFunKind</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>the_fun</span><span class='hs-layout'>)</span> <span class='hs-num'>1</span> <span class='hs-varid'>fun_kind</span> <span class='hs-varid'>args</span>
<a name="line-127"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>checkExpectedKind</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>res_kind</span> <span class='hs-varid'>exp_kind</span>
<a name="line-128"></a>       	     <span class='hs-comment'>-- Check the result kind *before* checking argument kinds</span>
<a name="line-129"></a>	     <span class='hs-comment'>-- This improves error message; Trac #2994</span>
<a name="line-130"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>kc_check_lhs_types</span> <span class='hs-varid'>args_w_kinds</span> <span class='hs-layout'>}</span>
<a name="line-131"></a>
<a name="line-132"></a><a name="splitHsAppTys"></a><span class='hs-definition'>splitHsAppTys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-definition'>splitHsAppTys</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>arg_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>split</span> <span class='hs-varid'>fun_ty</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>arg_ty</span><span class='hs-keyglyph'>]</span>
<a name="line-134"></a>  <span class='hs-keyword'>where</span>
<a name="line-135"></a>    <span class='hs-varid'>split</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyword'>as</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>split</span> <span class='hs-varid'>f</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-conop'>:</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span>
<a name="line-136"></a>    <span class='hs-varid'>split</span> <span class='hs-varid'>f</span>       	      <span class='hs-keyword'>as</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span><span class='hs-layout'>,</span><span class='hs-keyword'>as</span><span class='hs-layout'>)</span>
<a name="line-137"></a>
<a name="line-138"></a><a name="mkHsAppTys"></a><span class='hs-definition'>mkHsAppTys</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span>
<a name="line-139"></a><span class='hs-definition'>mkHsAppTys</span> <span class='hs-varid'>fun_ty</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"mkHsAppTys"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>fun_ty</span><span class='hs-layout'>)</span>
<a name="line-140"></a><span class='hs-definition'>mkHsAppTys</span> <span class='hs-varid'>fun_ty</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg_ty</span><span class='hs-conop'>:</span><span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-141"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-varid'>mk_app</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>arg_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>arg_tys</span>
<a name="line-142"></a>  <span class='hs-keyword'>where</span>
<a name="line-143"></a>    <span class='hs-varid'>mk_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsAppTy</span> <span class='hs-layout'>(</span><span class='hs-varid'>noLoc</span> <span class='hs-varid'>fun</span><span class='hs-layout'>)</span> <span class='hs-varid'>arg</span>	<span class='hs-comment'>-- Add noLocs for inner nodes of</span>
<a name="line-144"></a>					 	<span class='hs-comment'>-- the application; they are</span>
<a name="line-145"></a>						<span class='hs-comment'>-- never used </span>
<a name="line-146"></a>
<a name="line-147"></a><a name="splitFunKind"></a><span class='hs-comment'>---------------------------</span>
<a name="line-148"></a><span class='hs-definition'>splitFunKind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>b</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>b</span><span class='hs-layout'>,</span><span class='hs-conid'>ExpKind</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-149"></a><span class='hs-definition'>splitFunKind</span> <span class='hs-keyword'>_</span>       <span class='hs-keyword'>_</span>      <span class='hs-varid'>fk</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>fk</span><span class='hs-layout'>)</span>
<a name="line-150"></a><span class='hs-definition'>splitFunKind</span> <span class='hs-varid'>the_fun</span> <span class='hs-varid'>arg_no</span> <span class='hs-varid'>fk</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg</span><span class='hs-conop'>:</span><span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-151"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mb_fk</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unifyFunKind</span> <span class='hs-varid'>fk</span>
<a name="line-152"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_fk</span> <span class='hs-keyword'>of</span>
<a name="line-153"></a>            <span class='hs-conid'>Nothing</span>       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-varid'>too_many_args</span> 
<a name="line-154"></a>            <span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-varid'>ak</span><span class='hs-layout'>,</span><span class='hs-varid'>fk'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>aks</span><span class='hs-layout'>,</span> <span class='hs-varid'>rk</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>splitFunKind</span> <span class='hs-varid'>the_fun</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg_no</span><span class='hs-varop'>+</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-varid'>fk'</span> <span class='hs-varid'>args</span>
<a name="line-155"></a>                                <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>arg</span><span class='hs-layout'>,</span> <span class='hs-conid'>EK</span> <span class='hs-varid'>ak</span> <span class='hs-layout'>(</span><span class='hs-conid'>EkArg</span> <span class='hs-varid'>the_fun</span> <span class='hs-varid'>arg_no</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>aks</span><span class='hs-layout'>,</span> <span class='hs-varid'>rk</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-156"></a>  <span class='hs-keyword'>where</span>
<a name="line-157"></a>    <span class='hs-varid'>too_many_args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotes</span> <span class='hs-varid'>the_fun</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-158"></a>		    <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is applied to too many type arguments"</span><span class='hs-layout'>)</span>
<a name="line-159"></a>
<a name="line-160"></a><a name="kcHsContext"></a><span class='hs-comment'>---------------------------</span>
<a name="line-161"></a><span class='hs-definition'>kcHsContext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsContext</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsContext</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-162"></a><span class='hs-definition'>kcHsContext</span> <span class='hs-varid'>ctxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrapLocM</span> <span class='hs-layout'>(</span><span class='hs-varid'>mapM</span> <span class='hs-varid'>kcHsLPred</span><span class='hs-layout'>)</span> <span class='hs-varid'>ctxt</span>
<a name="line-163"></a>
<a name="line-164"></a><a name="kcHsLPred"></a><span class='hs-definition'>kcHsLPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>LHsPred</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-165"></a><span class='hs-definition'>kcHsLPred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>kcHsPred</span>
<a name="line-166"></a>
<a name="line-167"></a><a name="kcHsPred"></a><span class='hs-definition'>kcHsPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-168"></a><span class='hs-definition'>kcHsPred</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-comment'>-- Checks that the result is of kind liftedType</span>
<a name="line-169"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>pred'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_pred</span> <span class='hs-varid'>pred</span>
<a name="line-170"></a>    <span class='hs-varid'>checkExpectedKind</span> <span class='hs-varid'>pred</span> <span class='hs-varid'>kind</span> <span class='hs-varid'>ekLifted</span>
<a name="line-171"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>pred'</span>
<a name="line-172"></a>    
<a name="line-173"></a><a name="kc_pred"></a><span class='hs-comment'>---------------------------</span>
<a name="line-174"></a><span class='hs-definition'>kc_pred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>	
<a name="line-175"></a>	<span class='hs-comment'>-- Does *not* check for a saturated</span>
<a name="line-176"></a>	<span class='hs-comment'>-- application (reason: used from TcDeriv)</span>
<a name="line-177"></a><span class='hs-definition'>kc_pred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIParam</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-178"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty</span>
<a name="line-179"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIParam</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-180"></a>       <span class='hs-layout'>}</span>
<a name="line-181"></a><span class='hs-definition'>kc_pred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsClassP</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-182"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcClass</span> <span class='hs-varid'>cls</span>
<a name="line-183"></a>       <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kcApps</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>kind</span> <span class='hs-varid'>tys</span>
<a name="line-184"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsClassP</span> <span class='hs-varid'>cls</span> <span class='hs-varid'>tys'</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span>
<a name="line-185"></a>       <span class='hs-layout'>}</span>
<a name="line-186"></a><span class='hs-definition'>kc_pred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsEqualP</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-187"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty1'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty1</span>
<a name="line-188"></a><span class='hs-comment'>--       ; checkExpectedKind ty1 kind1 liftedTypeKind</span>
<a name="line-189"></a>       <span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>kind2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>kc_lhs_type</span> <span class='hs-varid'>ty2</span>
<a name="line-190"></a><span class='hs-comment'>--       ; checkExpectedKind ty2 kind2 liftedTypeKind</span>
<a name="line-191"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>checkExpectedKind</span> <span class='hs-varid'>ty2</span> <span class='hs-varid'>kind2</span> <span class='hs-layout'>(</span><span class='hs-conid'>EK</span> <span class='hs-varid'>kind1</span> <span class='hs-conid'>EkEqPred</span><span class='hs-layout'>)</span>
<a name="line-192"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsEqualP</span> <span class='hs-varid'>ty1'</span> <span class='hs-varid'>ty2'</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-193"></a>       <span class='hs-layout'>}</span>
<a name="line-194"></a>
<a name="line-195"></a><a name="kcTyVar"></a><span class='hs-comment'>---------------------------</span>
<a name="line-196"></a><span class='hs-definition'>kcTyVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcKind</span>
<a name="line-197"></a><span class='hs-definition'>kcTyVar</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-comment'>-- Could be a tyvar or a tycon</span>
<a name="line-198"></a>    <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"lk1"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-199"></a>    <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookup</span> <span class='hs-varid'>name</span>
<a name="line-200"></a>    <span class='hs-varid'>traceTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"lk2"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span>
<a name="line-201"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span> 
<a name="line-202"></a>        <span class='hs-conid'>ATyVar</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>typeKind</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-203"></a>        <span class='hs-conid'>AThing</span> <span class='hs-varid'>kind</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>kind</span>
<a name="line-204"></a>        <span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConKind</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-205"></a>        <span class='hs-keyword'>_</span>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>wrongThingErr</span> <span class='hs-str'>"type"</span> <span class='hs-varid'>thing</span> <span class='hs-varid'>name</span>
<a name="line-206"></a>
<a name="line-207"></a><a name="kcClass"></a><span class='hs-definition'>kcClass</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>TcKind</span>
<a name="line-208"></a><span class='hs-definition'>kcClass</span> <span class='hs-varid'>cls</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-comment'>-- Must be a class</span>
<a name="line-209"></a>    <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookup</span> <span class='hs-varid'>cls</span>
<a name="line-210"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-211"></a>        <span class='hs-conid'>AThing</span> <span class='hs-varid'>kind</span>             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>kind</span>
<a name="line-212"></a>        <span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConKind</span> <span class='hs-layout'>(</span><span class='hs-varid'>classTyCon</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-213"></a>        <span class='hs-keyword'>_</span>                       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>wrongThingErr</span> <span class='hs-str'>"class"</span> <span class='hs-varid'>thing</span> <span class='hs-varid'>cls</span>
</pre>\end{code}


%************************************************************************
%*									*
		Desugaring
%*									*
%************************************************************************

The type desugarer

	* Transforms from HsType to Type
	* Zonks any kinds

It cannot fail, and does no validity checking, except for 
structural matters, such as
	(a) spurious ! annotations.
	(b) a class used as a type

\begin{code}
<pre><a name="line-1"></a><a name="dsHsType"></a><span class='hs-definition'>dsHsType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-2"></a><span class='hs-comment'>-- All HsTyVarBndrs in the intput type are kind-annotated</span>
<a name="line-3"></a><span class='hs-definition'>dsHsType</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="ds_type"></a><span class='hs-definition'>ds_type</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-6"></a><span class='hs-definition'>ds_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ds_app</span> <span class='hs-varid'>ty</span> <span class='hs-conid'>[]</span>
<a name="line-8"></a>
<a name="line-9"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>		<span class='hs-comment'>-- Remove the parentheses markers</span>
<a name="line-10"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>ds_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsBangTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>    <span class='hs-comment'>-- No bangs should be here</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Unexpected strictness annotation:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-14"></a>
<a name="line-15"></a><span class='hs-definition'>ds_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsRecTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>	    <span class='hs-comment'>-- No bangs should be here</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Unexpected record type:"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsKindSig</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-19"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>	<span class='hs-comment'>-- Kind checking done already</span>
<a name="line-20"></a>
<a name="line-21"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsListTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-22"></a>    <span class='hs-varid'>tau_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-23"></a>    <span class='hs-varid'>checkWiredInTyCon</span> <span class='hs-varid'>listTyCon</span>
<a name="line-24"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkListTy</span> <span class='hs-varid'>tau_ty</span><span class='hs-layout'>)</span>
<a name="line-25"></a>
<a name="line-26"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPArrTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-27"></a>    <span class='hs-varid'>tau_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-28"></a>    <span class='hs-varid'>checkWiredInTyCon</span> <span class='hs-varid'>parrTyCon</span>
<a name="line-29"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPArrTy</span> <span class='hs-varid'>tau_ty</span><span class='hs-layout'>)</span>
<a name="line-30"></a>
<a name="line-31"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTupleTy</span> <span class='hs-varid'>boxity</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-32"></a>    <span class='hs-varid'>tau_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsTypes</span> <span class='hs-varid'>tys</span>
<a name="line-33"></a>    <span class='hs-varid'>checkWiredInTyCon</span> <span class='hs-varid'>tycon</span>
<a name="line-34"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tycon</span> <span class='hs-varid'>tau_tys</span><span class='hs-layout'>)</span>
<a name="line-35"></a>  <span class='hs-keyword'>where</span>
<a name="line-36"></a>    <span class='hs-varid'>tycon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tupleTyCon</span> <span class='hs-varid'>boxity</span> <span class='hs-layout'>(</span><span class='hs-varid'>length</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-37"></a>
<a name="line-38"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsFunTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-39"></a>    <span class='hs-varid'>tau_ty1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty1</span>
<a name="line-40"></a>    <span class='hs-varid'>tau_ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty2</span>
<a name="line-41"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkFunTy</span> <span class='hs-varid'>tau_ty1</span> <span class='hs-varid'>tau_ty2</span><span class='hs-layout'>)</span>
<a name="line-42"></a>
<a name="line-43"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>ty1</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>op</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-44"></a>    <span class='hs-varid'>tau_ty1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty1</span>
<a name="line-45"></a>    <span class='hs-varid'>tau_ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty2</span>
<a name="line-46"></a>    <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>span</span> <span class='hs-layout'>(</span><span class='hs-varid'>ds_var_app</span> <span class='hs-varid'>op</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tau_ty1</span><span class='hs-layout'>,</span><span class='hs-varid'>tau_ty2</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsNumTy</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>
<a name="line-49"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-varop'>==</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-keyword'>do</span>
<a name="line-50"></a>    <span class='hs-varid'>tc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupTyCon</span> <span class='hs-varid'>genUnitTyConName</span>
<a name="line-51"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tc</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span>
<a name="line-52"></a>
<a name="line-53"></a><span class='hs-definition'>ds_type</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>@</span><span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>
<a name="line-54"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ds_app</span> <span class='hs-varid'>ty</span> <span class='hs-conid'>[]</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-57"></a>    <span class='hs-varid'>pred'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsPred</span> <span class='hs-varid'>pred</span>
<a name="line-58"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkPredTy</span> <span class='hs-varid'>pred'</span><span class='hs-layout'>)</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsForAllTy</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tv_names</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-61"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tcTyVarBndrs</span> <span class='hs-varid'>tv_names</span>               <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span> <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-62"></a>    <span class='hs-varid'>theta</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>dsHsLPred</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ctxt</span><span class='hs-layout'>)</span>
<a name="line-63"></a>    <span class='hs-varid'>tau</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-64"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSigmaTy</span> <span class='hs-varid'>tyvars</span> <span class='hs-varid'>theta</span> <span class='hs-varid'>tau</span><span class='hs-layout'>)</span>
<a name="line-65"></a>
<a name="line-66"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsDocTy</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-comment'>-- Remove the doc comment</span>
<a name="line-67"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTyOut</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> 
<a name="line-70"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>kind'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcKindToKind</span> <span class='hs-varid'>kind</span>
<a name="line-71"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>newFlexiTyVarTy</span> <span class='hs-varid'>kind'</span> <span class='hs-layout'>}</span>
<a name="line-72"></a>
<a name="line-73"></a><span class='hs-definition'>ds_type</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsSpliceTy</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"ds_type"</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="dsHsTypes"></a><span class='hs-definition'>dsHsTypes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span>
<a name="line-76"></a><span class='hs-definition'>dsHsTypes</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>arg_tys</span>
</pre>\end{code}

Help functions for type applications
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

\begin{code}
<pre><a name="line-1"></a><a name="ds_app"></a><span class='hs-definition'>ds_app</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-2"></a><span class='hs-definition'>ds_app</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-varid'>tys</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ds_app</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>ty1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty2</span><span class='hs-conop'>:</span><span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-4"></a>
<a name="line-5"></a><span class='hs-definition'>ds_app</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-6"></a>    <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsTypes</span> <span class='hs-varid'>tys</span>
<a name="line-7"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>ty</span> <span class='hs-keyword'>of</span>
<a name="line-8"></a>	<span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>fun</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ds_var_app</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg_tys</span>
<a name="line-9"></a>	<span class='hs-keyword'>_</span>           <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>fun_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ds_type</span> <span class='hs-varid'>ty</span>
<a name="line-10"></a>                          <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAppTys</span> <span class='hs-varid'>fun_ty</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="ds_var_app"></a><span class='hs-definition'>ds_var_app</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Type</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>Type</span>
<a name="line-13"></a><span class='hs-definition'>ds_var_app</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-14"></a>    <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookup</span> <span class='hs-varid'>name</span>
<a name="line-15"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-16"></a>	<span class='hs-conid'>ATyVar</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAppTys</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-17"></a>	<span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>tc</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-18"></a>	<span class='hs-keyword'>_</span>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>wrongThingErr</span> <span class='hs-str'>"type"</span> <span class='hs-varid'>thing</span> <span class='hs-varid'>name</span>
</pre>\end{code}


Contexts
~~~~~~~~

\begin{code}
<pre><a name="line-1"></a><a name="dsHsLPred"></a><span class='hs-definition'>dsHsLPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>PredType</span>
<a name="line-2"></a><span class='hs-definition'>dsHsLPred</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dsHsPred</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="dsHsPred"></a><span class='hs-definition'>dsHsPred</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>PredType</span>
<a name="line-5"></a><span class='hs-definition'>dsHsPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsClassP</span> <span class='hs-varid'>class_name</span> <span class='hs-varid'>tys</span><span class='hs-layout'>)</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>arg_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsTypes</span> <span class='hs-varid'>tys</span>
<a name="line-7"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>clas</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookupClass</span> <span class='hs-varid'>class_name</span>
<a name="line-8"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>ClassP</span> <span class='hs-varid'>clas</span> <span class='hs-varid'>arg_tys</span><span class='hs-layout'>)</span>
<a name="line-9"></a>       <span class='hs-layout'>}</span>
<a name="line-10"></a><span class='hs-definition'>dsHsPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsEqualP</span> <span class='hs-varid'>ty1</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>arg_ty1</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty1</span>
<a name="line-12"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>arg_ty2</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty2</span>
<a name="line-13"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>EqPred</span> <span class='hs-varid'>arg_ty1</span> <span class='hs-varid'>arg_ty2</span><span class='hs-layout'>)</span>
<a name="line-14"></a>       <span class='hs-layout'>}</span>
<a name="line-15"></a><span class='hs-definition'>dsHsPred</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsIParam</span> <span class='hs-varid'>name</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>arg_ty</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>ty</span>
<a name="line-17"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>IParam</span> <span class='hs-varid'>name</span> <span class='hs-varid'>arg_ty</span><span class='hs-layout'>)</span>
<a name="line-18"></a>       <span class='hs-layout'>}</span>
</pre>\end{code}

GADT constructor signatures

\begin{code}
<pre><a name="line-1"></a><a name="tcLHsConResTy"></a><span class='hs-definition'>tcLHsConResTy</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TcType</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-definition'>tcLHsConResTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setSrcSpan</span> <span class='hs-varid'>span</span> <span class='hs-varop'>$</span>
<a name="line-4"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>get_args</span> <span class='hs-varid'>res_ty</span> <span class='hs-conid'>[]</span> <span class='hs-keyword'>of</span>
<a name="line-5"></a>	   <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>tc_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span> 
<a name="line-6"></a>	      <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>args'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>dsHsType</span> <span class='hs-varid'>args</span>
<a name="line-7"></a>		    <span class='hs-layout'>;</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcLookup</span> <span class='hs-varid'>tc_name</span>
<a name="line-8"></a>		    <span class='hs-layout'>;</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>thing</span> <span class='hs-keyword'>of</span>
<a name="line-9"></a>		        <span class='hs-conid'>AGlobal</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tc</span><span class='hs-layout'>,</span> <span class='hs-varid'>args'</span><span class='hs-layout'>)</span>
<a name="line-10"></a>		        <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>badGadtDecl</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-11"></a>	   <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>badGadtDecl</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span>
<a name="line-12"></a>  <span class='hs-keyword'>where</span>
<a name="line-13"></a>	<span class='hs-comment'>-- We can't call dsHsType on res_ty, and then do tcSplitTyConApp_maybe</span>
<a name="line-14"></a>	<span class='hs-comment'>-- because that causes a black hole, and for good reason.  Building</span>
<a name="line-15"></a>	<span class='hs-comment'>-- the type means expanding type synonyms, and we can't do that</span>
<a name="line-16"></a>	<span class='hs-comment'>-- inside the "knot".  So we have to work by steam.</span>
<a name="line-17"></a>    <span class='hs-varid'>get_args</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsAppTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fun</span><span class='hs-layout'>)</span> <span class='hs-varid'>arg</span><span class='hs-layout'>)</span>   <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_args</span> <span class='hs-varid'>fun</span> <span class='hs-layout'>(</span><span class='hs-varid'>arg</span><span class='hs-conop'>:</span><span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-18"></a>    <span class='hs-varid'>get_args</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsParTy</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>        <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>get_args</span> <span class='hs-varid'>ty</span>  <span class='hs-varid'>args</span>
<a name="line-19"></a>    <span class='hs-varid'>get_args</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsOpTy</span> <span class='hs-varid'>ty1</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty2</span><span class='hs-layout'>)</span> <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVar</span> <span class='hs-varid'>tc</span><span class='hs-layout'>,</span> <span class='hs-varid'>ty1</span><span class='hs-conop'>:</span><span class='hs-varid'>ty2</span><span class='hs-conop'>:</span><span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-20"></a>    <span class='hs-varid'>get_args</span> <span class='hs-varid'>ty</span>                        <span class='hs-varid'>args</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>args</span><span class='hs-layout'>)</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="badGadtDecl"></a><span class='hs-definition'>badGadtDecl</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-23"></a><span class='hs-definition'>badGadtDecl</span> <span class='hs-varid'>ty</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Malformed constructor result type:"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-25"></a>       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="addKcTypeCtxt"></a><span class='hs-definition'>addKcTypeCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span>
<a name="line-28"></a>	<span class='hs-comment'>-- Wrap a context around only if we want to show that contexts.  </span>
<a name="line-29"></a><span class='hs-definition'>addKcTypeCtxt</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPredTy</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thing</span>
<a name="line-30"></a>	<span class='hs-comment'>-- Omit invisble ones and ones user's won't grok (HsPred p).</span>
<a name="line-31"></a><span class='hs-definition'>addKcTypeCtxt</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>other_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErrCtxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>typeCtxt</span> <span class='hs-varid'>other_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="typeCtxt"></a><span class='hs-definition'>typeCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-34"></a><span class='hs-definition'>typeCtxt</span> <span class='hs-varid'>ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"In the type"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
		Type-variable binders
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="kcHsTyVars"></a><span class='hs-definition'>kcHsTyVars</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> 
<a name="line-2"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> 	<span class='hs-comment'>-- These binders are kind-annotated</span>
<a name="line-3"></a>						<span class='hs-comment'>-- They scope over the thing inside</span>
<a name="line-4"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>r</span>
<a name="line-5"></a><span class='hs-definition'>kcHsTyVars</span> <span class='hs-varid'>tvs</span> <span class='hs-varid'>thing_inside</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-6"></a>    <span class='hs-varid'>bndrs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>wrapLocM</span> <span class='hs-varid'>kcHsTyVar</span><span class='hs-layout'>)</span> <span class='hs-varid'>tvs</span>
<a name="line-7"></a>    <span class='hs-varid'>tcExtendKindEnvTvs</span> <span class='hs-varid'>bndrs</span> <span class='hs-layout'>(</span><span class='hs-varid'>thing_inside</span> <span class='hs-varid'>bndrs</span><span class='hs-layout'>)</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="kcHsTyVar"></a><span class='hs-definition'>kcHsTyVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsTyVarBndr</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-10"></a>	<span class='hs-comment'>-- Return a *kind-annotated* binder, and a tyvar with a mutable kind in it	</span>
<a name="line-11"></a><span class='hs-definition'>kcHsTyVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>UserTyVar</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>        <span class='hs-keyglyph'>=</span> <span class='hs-conid'>KindedTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varop'>&lt;$&gt;</span> <span class='hs-varid'>newKindVar</span>
<a name="line-12"></a><span class='hs-definition'>kcHsTyVar</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="tcTyVarBndrs"></a><span class='hs-comment'>------------------</span>
<a name="line-15"></a><span class='hs-definition'>tcTyVarBndrs</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>LHsTyVarBndr</span> <span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span> 	<span class='hs-comment'>-- Kind-annotated binders, which need kind-zonking</span>
<a name="line-16"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-17"></a>	     <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>r</span>
<a name="line-18"></a><span class='hs-comment'>-- Used when type-checking types/classes/type-decls</span>
<a name="line-19"></a><span class='hs-comment'>-- Brings into scope immutable TyVars, not mutable ones that require later zonking</span>
<a name="line-20"></a><span class='hs-definition'>tcTyVarBndrs</span> <span class='hs-varid'>bndrs</span> <span class='hs-varid'>thing_inside</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-21"></a>    <span class='hs-varid'>tyvars</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-layout'>(</span><span class='hs-varid'>zonk</span> <span class='hs-varop'>.</span> <span class='hs-varid'>unLoc</span><span class='hs-layout'>)</span> <span class='hs-varid'>bndrs</span>
<a name="line-22"></a>    <span class='hs-varid'>tcExtendTyVarEnv</span> <span class='hs-varid'>tyvars</span> <span class='hs-layout'>(</span><span class='hs-varid'>thing_inside</span> <span class='hs-varid'>tyvars</span><span class='hs-layout'>)</span>
<a name="line-23"></a>  <span class='hs-keyword'>where</span>
<a name="line-24"></a>    <span class='hs-varid'>zonk</span> <span class='hs-layout'>(</span><span class='hs-conid'>KindedTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>kind'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcKindToKind</span> <span class='hs-varid'>kind</span>
<a name="line-25"></a>				      <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind'</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-26"></a>    <span class='hs-varid'>zonk</span> <span class='hs-layout'>(</span><span class='hs-conid'>UserTyVar</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WARN</span><span class='hs-layout'>(</span> <span class='hs-conid'>True</span><span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Un-kinded tyvar"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>name</span> <span class='hs-layout'>)</span>
<a name="line-27"></a>			    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>liftedTypeKind</span><span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="tcDataKindSig"></a><span class='hs-comment'>-----------------------------------</span>
<a name="line-30"></a><span class='hs-definition'>tcDataKindSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Kind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span>
<a name="line-31"></a><span class='hs-comment'>-- GADT decls can have a (perhaps partial) kind signature</span>
<a name="line-32"></a><span class='hs-comment'>--	e.g.  data T :: * -&gt; * -&gt; * where ...</span>
<a name="line-33"></a><span class='hs-comment'>-- This function makes up suitable (kinded) type variables for </span>
<a name="line-34"></a><span class='hs-comment'>-- the argument kinds, and checks that the result kind is indeed *.</span>
<a name="line-35"></a><span class='hs-comment'>-- We use it also to make up argument type variables for for data instances.</span>
<a name="line-36"></a><span class='hs-definition'>tcDataKindSig</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>[]</span>
<a name="line-37"></a><span class='hs-definition'>tcDataKindSig</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-38"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>badKindSig</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
<a name="line-39"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>span</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSrcSpanM</span>
<a name="line-40"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>us</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>newUniqueSupply</span> 
<a name="line-41"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>uniqs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>uniqsFromSupply</span> <span class='hs-varid'>us</span>
<a name="line-42"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>mk_tv</span> <span class='hs-varid'>span</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>str</span> <span class='hs-varid'>kind</span> 
<a name="line-43"></a>		 <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>kind</span><span class='hs-layout'>,</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>uniq</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>arg_kinds</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>dnames</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>uniqs</span> <span class='hs-keyglyph'>]</span> <span class='hs-layout'>}</span>
<a name="line-44"></a>  <span class='hs-keyword'>where</span>
<a name="line-45"></a>    <span class='hs-layout'>(</span><span class='hs-varid'>arg_kinds</span><span class='hs-layout'>,</span> <span class='hs-varid'>res_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitKindFunTys</span> <span class='hs-varid'>kind</span>
<a name="line-46"></a>    <span class='hs-varid'>mk_tv</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>str</span> <span class='hs-varid'>kind</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkTyVar</span> <span class='hs-varid'>name</span> <span class='hs-varid'>kind</span>
<a name="line-47"></a>	<span class='hs-keyword'>where</span>
<a name="line-48"></a>	   <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkInternalName</span> <span class='hs-varid'>uniq</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>loc</span>
<a name="line-49"></a>	   <span class='hs-varid'>occ</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccName</span> <span class='hs-varid'>tvName</span> <span class='hs-varid'>str</span>
<a name="line-50"></a>	  
<a name="line-51"></a>    <span class='hs-varid'>dnames</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-chr'>'$'</span> <span class='hs-conop'>:</span><span class='hs-layout'>)</span> <span class='hs-varid'>names</span>	<span class='hs-comment'>-- Note [Avoid name clashes for associated data types]</span>
<a name="line-52"></a>
<a name="line-53"></a>    <span class='hs-varid'>names</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span>
<a name="line-54"></a>    <span class='hs-varid'>names</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>c</span><span class='hs-conop'>:</span><span class='hs-varid'>cs</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>cs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-str'>""</span> <span class='hs-conop'>:</span> <span class='hs-varid'>names</span><span class='hs-layout'>,</span> <span class='hs-varid'>c</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-chr'>'a'</span><span class='hs-keyglyph'>..</span><span class='hs-chr'>'z'</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>]</span> 
<a name="line-55"></a>
<a name="line-56"></a><a name="badKindSig"></a><span class='hs-definition'>badKindSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Kind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-57"></a><span class='hs-definition'>badKindSig</span> <span class='hs-varid'>kind</span> 
<a name="line-58"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Kind signature on data type declaration has non-* return kind"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-59"></a>	<span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>kind</span><span class='hs-layout'>)</span>
</pre>\end{code}

Note [Avoid name clashes for associated data types]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Consider    class C a b where
               data D b :: * -> *
When typechecking the decl for D, we'll invent an extra type variable for D,
to fill out its kind.  We *don't* want this type variable to be 'a', because
in an .hi file we'd get
            class C a b where
               data D b a 
which makes it look as if there are *two* type indices.  But there aren't!
So we use $a instead, which cannot clash with a user-written type variable.
Remember that type variable binders in interface files are just FastStrings,
not proper Names.

(The tidying phase can't help here because we don't tidy TyCons.  Another
alternative would be to record the number of indexing parameters in the 
interface file.)


%************************************************************************
%*									*
		Scoped type variables
%*									*
%************************************************************************


tcAddScopedTyVars is used for scoped type variables added by pattern
type signatures
	e.g.  \ ((x::a), (y::a)) -> x+y
They never have explicit kinds (because this is source-code only)
They are mutable (because they can get bound to a more specific type).

Usually we kind-infer and expand type splices, and then
tupecheck/desugar the type.  That doesn't work well for scoped type
variables, because they scope left-right in patterns.  (e.g. in the
example above, the 'a' in (y::a) is bound by the 'a' in (x::a).

The current not-very-good plan is to
  * find all the types in the patterns
  * find their free tyvars
  * do kind inference
  * bring the kinded type vars into scope
  * BUT throw away the kind-checked type
  	(we'll kind-check it again when we type-check the pattern)

This is bad because throwing away the kind checked type throws away
its splices.  But too bad for now.  [July 03]

Historical note:
    We no longer specify that these type variables must be univerally 
    quantified (lots of email on the subject).  If you want to put that 
    back in, you need to
	a) Do a checkSigTyVars after thing_inside
	b) More insidiously, don't pass in expected_ty, else
	   we unify with it too early and checkSigTyVars barfs
	   Instead you have to pass in a fresh ty var, and unify
	   it with expected_ty afterwards

\begin{code}
<pre><a name="line-1"></a><a name="tcHsPatSigType"></a><span class='hs-definition'>tcHsPatSigType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UserTypeCtxt</span>
<a name="line-2"></a>	       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> 		<span class='hs-comment'>-- The type signature</span>
<a name="line-3"></a>	       <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> 	<span class='hs-comment'>-- Newly in-scope type variables</span>
<a name="line-4"></a>			<span class='hs-conid'>Type</span><span class='hs-layout'>)</span>		<span class='hs-comment'>-- The signature</span>
<a name="line-5"></a><span class='hs-comment'>-- Used for type-checking type signatures in</span>
<a name="line-6"></a><span class='hs-comment'>-- (a) patterns 	  e.g  f (x::Int) = e</span>
<a name="line-7"></a><span class='hs-comment'>-- (b) result signatures  e.g. g x :: Int = e</span>
<a name="line-8"></a><span class='hs-comment'>-- (c) RULE forall bndrs  e.g. forall (x::Int). f x = x</span>
<a name="line-9"></a>
<a name="line-10"></a><span class='hs-definition'>tcHsPatSigType</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span> 
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addErrCtxt</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprHsSigCtxt</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-12"></a>    <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> 	<span class='hs-comment'>-- Find the type variables that are mentioned in the type</span>
<a name="line-13"></a>		<span class='hs-comment'>-- but not already in scope.  These are the ones that</span>
<a name="line-14"></a>		<span class='hs-comment'>-- should be bound by the pattern signature</span>
<a name="line-15"></a> 	  <span class='hs-varid'>in_scope</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getInLocalScope</span>
<a name="line-16"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>span</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getLoc</span> <span class='hs-varid'>hs_ty</span>
<a name="line-17"></a>	      <span class='hs-varid'>sig_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-conid'>L</span> <span class='hs-varid'>span</span> <span class='hs-layout'>(</span><span class='hs-conid'>UserTyVar</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> 
<a name="line-18"></a>			<span class='hs-keyglyph'>|</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>nameSetToList</span> <span class='hs-layout'>(</span><span class='hs-varid'>extractHsTyVars</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-19"></a>			  <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>in_scope</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-20"></a>
<a name="line-21"></a>	<span class='hs-layout'>;</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsQuantifiedType</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-varid'>hs_ty</span>
<a name="line-22"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkValidType</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>sig_ty</span> 
<a name="line-23"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyvars</span><span class='hs-layout'>,</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span>
<a name="line-24"></a>      <span class='hs-layout'>}</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="tcPatSig"></a><span class='hs-definition'>tcPatSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UserTypeCtxt</span>
<a name="line-27"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span>
<a name="line-28"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>BoxySigmaType</span>
<a name="line-29"></a>	 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>TcType</span><span class='hs-layout'>,</span>	   <span class='hs-comment'>-- The type to use for "inside" the signature</span>
<a name="line-30"></a>		 <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcType</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- The new bit of type environment, binding</span>
<a name="line-31"></a>				   <span class='hs-comment'>-- the scoped type variables</span>
<a name="line-32"></a>                 <span class='hs-conid'>CoercionI</span><span class='hs-layout'>)</span>        <span class='hs-comment'>-- Coercion due to unification with actual ty</span>
<a name="line-33"></a><span class='hs-definition'>tcPatSig</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>sig</span> <span class='hs-varid'>res_ty</span>
<a name="line-34"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>	<span class='hs-layout'>{</span> <span class='hs-layout'>(</span><span class='hs-varid'>sig_tvs</span><span class='hs-layout'>,</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcHsPatSigType</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>sig</span>
<a name="line-35"></a>
<a name="line-36"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-keyword'>then</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-37"></a>		<span class='hs-comment'>-- The type signature binds no type variables, </span>
<a name="line-38"></a>		<span class='hs-comment'>-- and hence is rigid, so use it to zap the res_ty</span>
<a name="line-39"></a>		  <span class='hs-varid'>coi</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>boxyUnify</span> <span class='hs-varid'>sig_ty</span> <span class='hs-varid'>res_ty</span>
<a name="line-40"></a>		<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>sig_ty</span><span class='hs-layout'>,</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span> <span class='hs-varid'>coi</span><span class='hs-layout'>)</span>
<a name="line-41"></a>
<a name="line-42"></a>	<span class='hs-layout'>}</span> <span class='hs-keyword'>else</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span>
<a name="line-43"></a>		<span class='hs-comment'>-- Type signature binds at least one scoped type variable</span>
<a name="line-44"></a>	
<a name="line-45"></a>		<span class='hs-comment'>-- A pattern binding cannot bind scoped type variables</span>
<a name="line-46"></a>		<span class='hs-comment'>-- The renamer fails with a name-out-of-scope error </span>
<a name="line-47"></a>		<span class='hs-comment'>-- if a pattern binding tries to bind a type variable,</span>
<a name="line-48"></a>		<span class='hs-comment'>-- So we just have an ASSERT here</span>
<a name="line-49"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>in_pat_bind</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>ctxt</span> <span class='hs-keyword'>of</span>
<a name="line-50"></a>				<span class='hs-conid'>BindPatSigCtxt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>True</span>
<a name="line-51"></a>				<span class='hs-keyword'>_</span>              <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>False</span>
<a name="line-52"></a>	<span class='hs-layout'>;</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>not</span> <span class='hs-varid'>in_pat_bind</span> <span class='hs-varop'>||</span> <span class='hs-varid'>null</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-layout'>)</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-53"></a>
<a name="line-54"></a>	  	<span class='hs-comment'>-- Check that pat_ty is rigid</span>
<a name="line-55"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>isRigidTy</span> <span class='hs-varid'>res_ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>wobblyPatSig</span> <span class='hs-varid'>sig_tvs</span><span class='hs-layout'>)</span>
<a name="line-56"></a>
<a name="line-57"></a>		<span class='hs-comment'>-- Check that all newly-in-scope tyvars are in fact</span>
<a name="line-58"></a>		<span class='hs-comment'>-- constrained by the pattern.  This catches tiresome</span>
<a name="line-59"></a>		<span class='hs-comment'>-- cases like	</span>
<a name="line-60"></a>		<span class='hs-comment'>--	type T a = Int</span>
<a name="line-61"></a>		<span class='hs-comment'>--	f :: Int -&gt; Int</span>
<a name="line-62"></a>		<span class='hs-comment'>-- 	f (x :: T a) = ...</span>
<a name="line-63"></a>		<span class='hs-comment'>-- Here 'a' doesn't get a binding.  Sigh</span>
<a name="line-64"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>bad_tvs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filterOut</span> <span class='hs-layout'>(</span><span class='hs-varop'>`elemVarSet`</span> <span class='hs-varid'>exactTyVarsOfType</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span> <span class='hs-varid'>sig_tvs</span>
<a name="line-65"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>bad_tvs</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>badPatSigTvs</span> <span class='hs-varid'>sig_ty</span> <span class='hs-varid'>bad_tvs</span><span class='hs-layout'>)</span>
<a name="line-66"></a>
<a name="line-67"></a>		<span class='hs-comment'>-- Now match the pattern signature against res_ty</span>
<a name="line-68"></a>		<span class='hs-comment'>-- For convenience, and uniform-looking error messages</span>
<a name="line-69"></a>		<span class='hs-comment'>-- we do the matching by allocating meta type variables, </span>
<a name="line-70"></a>		<span class='hs-comment'>-- unifying, and reading out the results.</span>
<a name="line-71"></a>		<span class='hs-comment'>-- This is a strictly local operation.</span>
<a name="line-72"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>box_tvs</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>tcInstBoxyTyVar</span> <span class='hs-varid'>sig_tvs</span>
<a name="line-73"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>coi</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>boxyUnify</span> <span class='hs-layout'>(</span><span class='hs-varid'>substTyWith</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkTyVarTys</span> <span class='hs-varid'>box_tvs</span><span class='hs-layout'>)</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span> 
<a name="line-74"></a>                           <span class='hs-varid'>res_ty</span>
<a name="line-75"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>sig_tv_tys</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>mapM</span> <span class='hs-varid'>readFilledBox</span> <span class='hs-varid'>box_tvs</span>
<a name="line-76"></a>
<a name="line-77"></a>		<span class='hs-comment'>-- Check that each is bound to a distinct type variable,</span>
<a name="line-78"></a>		<span class='hs-comment'>-- and one that is not already in scope</span>
<a name="line-79"></a>	<span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>tv_binds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>tyVarName</span> <span class='hs-varid'>sig_tvs</span> <span class='hs-varop'>`zip`</span> <span class='hs-varid'>sig_tv_tys</span>
<a name="line-80"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>binds_in_scope</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getScopedTyVarBinds</span>
<a name="line-81"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>check</span> <span class='hs-varid'>binds_in_scope</span> <span class='hs-varid'>tv_binds</span>
<a name="line-82"></a>	
<a name="line-83"></a>		<span class='hs-comment'>-- Phew!</span>
<a name="line-84"></a>	<span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>res_ty</span><span class='hs-layout'>,</span> <span class='hs-varid'>tv_binds</span><span class='hs-layout'>,</span> <span class='hs-varid'>coi</span><span class='hs-layout'>)</span>
<a name="line-85"></a>	<span class='hs-layout'>}</span> <span class='hs-layout'>}</span>
<a name="line-86"></a>  <span class='hs-keyword'>where</span>
<a name="line-87"></a>    <span class='hs-varid'>check</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-88"></a>    <span class='hs-varid'>check</span> <span class='hs-varid'>in_scope</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>rest</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>check_one</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ty</span>
<a name="line-89"></a>				      <span class='hs-layout'>;</span> <span class='hs-varid'>check</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>n</span><span class='hs-layout'>,</span><span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-conop'>:</span><span class='hs-varid'>in_scope</span><span class='hs-layout'>)</span> <span class='hs-varid'>rest</span> <span class='hs-layout'>}</span>
<a name="line-90"></a>
<a name="line-91"></a>    <span class='hs-varid'>check_one</span> <span class='hs-varid'>in_scope</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ty</span>
<a name="line-92"></a>	<span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcIsTyVarTy</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>scopedNonVar</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-93"></a>		<span class='hs-comment'>-- Must bind to a type variable</span>
<a name="line-94"></a>
<a name="line-95"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>checkTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>dups</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>dupInScope</span> <span class='hs-varid'>n</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>dups</span><span class='hs-layout'>)</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-96"></a>		<span class='hs-comment'>-- Must not bind to the same type variable</span>
<a name="line-97"></a>		<span class='hs-comment'>-- as some other in-scope type variable</span>
<a name="line-98"></a>
<a name="line-99"></a>	     <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span> <span class='hs-layout'>}</span>
<a name="line-100"></a>	<span class='hs-keyword'>where</span>
<a name="line-101"></a>	  <span class='hs-varid'>dups</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n'</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>n'</span><span class='hs-layout'>,</span><span class='hs-varid'>ty'</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>in_scope</span><span class='hs-layout'>,</span> <span class='hs-varid'>tcEqType</span> <span class='hs-varid'>ty'</span> <span class='hs-varid'>ty</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}


%************************************************************************
%*                                                                      *
        Checking kinds
%*                                                                      *
%************************************************************************

We would like to get a decent error message from
  (a) Under-applied type constructors
             f :: (Maybe, Maybe)
  (b) Over-applied type constructors
             f :: Int x -> Int x

\begin{code}
<pre><a name="line-1"></a><a name="ExpKind"></a><span class='hs-comment'>-- The ExpKind datatype means "expected kind" and contains </span>
<a name="line-2"></a><a name="ExpKind"></a><span class='hs-comment'>-- some info about just why that kind is expected, to improve</span>
<a name="line-3"></a><a name="ExpKind"></a><span class='hs-comment'>-- the error message on a mis-match</span>
<a name="line-4"></a><a name="ExpKind"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ExpKind</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EK</span> <span class='hs-conid'>TcKind</span> <span class='hs-conid'>EkCtxt</span>
<a name="line-5"></a><a name="EkCtxt"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>EkCtxt</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EkUnk</span>		<span class='hs-comment'>-- Unknown context</span>
<a name="line-6"></a>      	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EkEqPred</span>		<span class='hs-comment'>-- Second argument of an equality predicate</span>
<a name="line-7"></a>      	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EkKindSig</span>	<span class='hs-comment'>-- Kind signature</span>
<a name="line-8"></a>     	     <span class='hs-keyglyph'>|</span> <span class='hs-conid'>EkArg</span> <span class='hs-conid'>SDoc</span> <span class='hs-conid'>Int</span>   <span class='hs-comment'>-- Function, arg posn, expected kind</span>
<a name="line-9"></a>
<a name="line-10"></a>
<a name="line-11"></a><a name="ekLifted"></a><span class='hs-definition'>ekLifted</span><span class='hs-layout'>,</span> <span class='hs-varid'>ekOpen</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ExpKind</span>
<a name="line-12"></a><span class='hs-definition'>ekLifted</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EK</span> <span class='hs-varid'>liftedTypeKind</span> <span class='hs-conid'>EkUnk</span>
<a name="line-13"></a><a name="ekOpen"></a><span class='hs-definition'>ekOpen</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EK</span> <span class='hs-varid'>openTypeKind</span>   <span class='hs-conid'>EkUnk</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="checkExpectedKind"></a><span class='hs-definition'>checkExpectedKind</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ExpKind</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-conid'>()</span>
<a name="line-16"></a><span class='hs-comment'>-- A fancy wrapper for 'unifyKind', which tries</span>
<a name="line-17"></a><span class='hs-comment'>-- to give decent error messages.</span>
<a name="line-18"></a><span class='hs-comment'>--      (checkExpectedKind ty act_kind exp_kind)</span>
<a name="line-19"></a><span class='hs-comment'>-- checks that the actual kind act_kind is compatible</span>
<a name="line-20"></a><span class='hs-comment'>--      with the expected kind exp_kind</span>
<a name="line-21"></a><span class='hs-comment'>-- The first argument, ty, is used only in the error message generation</span>
<a name="line-22"></a><span class='hs-definition'>checkExpectedKind</span> <span class='hs-varid'>ty</span> <span class='hs-varid'>act_kind</span> <span class='hs-layout'>(</span><span class='hs-conid'>EK</span> <span class='hs-varid'>exp_kind</span> <span class='hs-varid'>ek_ctxt</span><span class='hs-layout'>)</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>act_kind</span> <span class='hs-varop'>`isSubKind`</span> <span class='hs-varid'>exp_kind</span> <span class='hs-comment'>-- Short cut for a very common case</span>
<a name="line-24"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-25"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-26"></a>    <span class='hs-layout'>(</span><span class='hs-sel'>_errs</span><span class='hs-layout'>,</span> <span class='hs-varid'>mb_r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tryTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>unifyKind</span> <span class='hs-varid'>exp_kind</span> <span class='hs-varid'>act_kind</span><span class='hs-layout'>)</span>
<a name="line-27"></a>    <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_r</span> <span class='hs-keyword'>of</span>
<a name="line-28"></a>        <span class='hs-conid'>Just</span> <span class='hs-keyword'>_</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>  <span class='hs-comment'>-- Unification succeeded</span>
<a name="line-29"></a>        <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-30"></a>
<a name="line-31"></a>        <span class='hs-comment'>-- So there's definitely an error</span>
<a name="line-32"></a>        <span class='hs-comment'>-- Now to find out what sort</span>
<a name="line-33"></a>           <span class='hs-varid'>exp_kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcKind</span> <span class='hs-varid'>exp_kind</span>
<a name="line-34"></a>           <span class='hs-varid'>act_kind</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>zonkTcKind</span> <span class='hs-varid'>act_kind</span>
<a name="line-35"></a>
<a name="line-36"></a>           <span class='hs-varid'>env0</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>tcInitTidyEnv</span>
<a name="line-37"></a>           <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>exp_as</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitKindFunTys</span> <span class='hs-varid'>exp_kind</span>
<a name="line-38"></a>               <span class='hs-layout'>(</span><span class='hs-varid'>act_as</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitKindFunTys</span> <span class='hs-varid'>act_kind</span>
<a name="line-39"></a>               <span class='hs-varid'>n_exp_as</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>exp_as</span>
<a name="line-40"></a>               <span class='hs-varid'>n_act_as</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>length</span> <span class='hs-varid'>act_as</span>
<a name="line-41"></a>
<a name="line-42"></a>               <span class='hs-layout'>(</span><span class='hs-varid'>env1</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidy_exp_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyKind</span> <span class='hs-varid'>env0</span> <span class='hs-varid'>exp_kind</span>
<a name="line-43"></a>               <span class='hs-layout'>(</span><span class='hs-varid'>env2</span><span class='hs-layout'>,</span> <span class='hs-varid'>tidy_act_kind</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tidyKind</span> <span class='hs-varid'>env1</span> <span class='hs-varid'>act_kind</span>
<a name="line-44"></a>
<a name="line-45"></a>               <span class='hs-varid'>err</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>n_exp_as</span> <span class='hs-varop'>&lt;</span> <span class='hs-varid'>n_act_as</span>     <span class='hs-comment'>-- E.g. [Maybe]</span>
<a name="line-46"></a>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is not applied to enough type arguments"</span><span class='hs-layout'>)</span>
<a name="line-47"></a>
<a name="line-48"></a>                     <span class='hs-comment'>-- Now n_exp_as &gt;= n_act_as. In the next two cases,</span>
<a name="line-49"></a>                     <span class='hs-comment'>-- n_exp_as == 0, and hence so is n_act_as</span>
<a name="line-50"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>exp_kind</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isUnliftedTypeKind</span> <span class='hs-varid'>act_kind</span>
<a name="line-51"></a>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Expecting a lifted type, but"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-52"></a>                       <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is unlifted"</span><span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isUnliftedTypeKind</span> <span class='hs-varid'>exp_kind</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>isLiftedTypeKind</span> <span class='hs-varid'>act_kind</span>
<a name="line-55"></a>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Expecting an unlifted type, but"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span>
<a name="line-56"></a>                       <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is lifted"</span><span class='hs-layout'>)</span>
<a name="line-57"></a>
<a name="line-58"></a>                   <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>               <span class='hs-comment'>-- E.g. Monad [Int]</span>
<a name="line-59"></a>                   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Kind mis-match"</span><span class='hs-layout'>)</span>
<a name="line-60"></a>
<a name="line-61"></a>               <span class='hs-varid'>more_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>expected_herald</span> <span class='hs-varid'>ek_ctxt</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"kind"</span><span class='hs-layout'>)</span> 
<a name="line-62"></a>                                    <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprKind</span> <span class='hs-varid'>tidy_exp_kind</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-63"></a>                                 <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"but"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span>
<a name="line-64"></a>                                     <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"has kind"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprKind</span> <span class='hs-varid'>tidy_act_kind</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-65"></a>
<a name="line-66"></a>               <span class='hs-varid'>expected_herald</span> <span class='hs-conid'>EkUnk</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Expected"</span><span class='hs-layout'>)</span>
<a name="line-67"></a>               <span class='hs-varid'>expected_herald</span> <span class='hs-conid'>EkKindSig</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"An enclosing kind signature specified"</span><span class='hs-layout'>)</span>
<a name="line-68"></a>               <span class='hs-varid'>expected_herald</span> <span class='hs-conid'>EkEqPred</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"The left argument of the equality predicate had"</span><span class='hs-layout'>)</span>
<a name="line-69"></a>               <span class='hs-varid'>expected_herald</span> <span class='hs-layout'>(</span><span class='hs-conid'>EkArg</span> <span class='hs-varid'>fun</span> <span class='hs-varid'>arg_no</span><span class='hs-layout'>)</span>
<a name="line-70"></a>	         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"The"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>speakNth</span> <span class='hs-varid'>arg_no</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"argument of"</span><span class='hs-layout'>)</span>
<a name="line-71"></a>		   <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-varid'>fun</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-layout'>(</span><span class='hs-str'>"should have"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-72"></a>
<a name="line-73"></a>           <span class='hs-varid'>failWithTcM</span> <span class='hs-layout'>(</span><span class='hs-varid'>env2</span><span class='hs-layout'>,</span> <span class='hs-varid'>err</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>more_info</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*									*
		Scoped type variables
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="pprHsSigCtxt"></a><span class='hs-definition'>pprHsSigCtxt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UserTypeCtxt</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>LHsType</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-2"></a><span class='hs-definition'>pprHsSigCtxt</span> <span class='hs-varid'>ctxt</span> <span class='hs-varid'>hs_ty</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"In"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>pprUserTypeCtxt</span> <span class='hs-varid'>ctxt</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>colon</span><span class='hs-layout'>,</span> 
<a name="line-3"></a>				 <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>pp_sig</span> <span class='hs-varid'>ctxt</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-4"></a>  <span class='hs-keyword'>where</span>
<a name="line-5"></a>    <span class='hs-varid'>pp_sig</span> <span class='hs-layout'>(</span><span class='hs-conid'>FunSigCtxt</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pp_n_colon</span> <span class='hs-varid'>n</span>
<a name="line-6"></a>    <span class='hs-varid'>pp_sig</span> <span class='hs-layout'>(</span><span class='hs-conid'>ConArgCtxt</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pp_n_colon</span> <span class='hs-varid'>n</span>
<a name="line-7"></a>    <span class='hs-varid'>pp_sig</span> <span class='hs-layout'>(</span><span class='hs-conid'>ForSigCtxt</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pp_n_colon</span> <span class='hs-varid'>n</span>
<a name="line-8"></a>    <span class='hs-varid'>pp_sig</span> <span class='hs-keyword'>_</span>               <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a>    <span class='hs-varid'>pp_n_colon</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>dcolon</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>unLoc</span> <span class='hs-varid'>hs_ty</span><span class='hs-layout'>)</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="wobblyPatSig"></a><span class='hs-definition'>wobblyPatSig</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Var</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-13"></a><span class='hs-definition'>wobblyPatSig</span> <span class='hs-varid'>sig_tvs</span>
<a name="line-14"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"A pattern type signature cannot bind scoped type variables"</span><span class='hs-layout'>)</span> 
<a name="line-15"></a>		<span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>pprQuotedList</span> <span class='hs-varid'>sig_tvs</span><span class='hs-layout'>)</span>
<a name="line-16"></a>       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"unless the pattern has a rigid type context"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-17"></a>		
<a name="line-18"></a><a name="badPatSigTvs"></a><span class='hs-definition'>badPatSigTvs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TcType</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyVar</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-19"></a><span class='hs-definition'>badPatSigTvs</span> <span class='hs-varid'>sig_ty</span> <span class='hs-varid'>bad_tvs</span>
<a name="line-20"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>fsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"The type variable"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>plural</span> <span class='hs-varid'>bad_tvs</span><span class='hs-layout'>,</span> 
<a name="line-21"></a>                 <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprWithCommas</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>bad_tvs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-22"></a>          	 <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"should be bound by the pattern signature"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>sig_ty</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-23"></a>	  	 <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"but are actually discarded by a type synonym"</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-24"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"To fix this, expand the type synonym"</span><span class='hs-layout'>)</span> 
<a name="line-25"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"[Note: I hope to lift this restriction in due course]"</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>]</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="scopedNonVar"></a><span class='hs-definition'>scopedNonVar</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-28"></a><span class='hs-definition'>scopedNonVar</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ty</span>
<a name="line-29"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"The scoped type variable"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-30"></a>	       <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"is bound to the type"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>ty</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-31"></a>	  <span class='hs-varid'>nest</span> <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"You can only bind scoped type variables to type variables"</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="dupInScope"></a><span class='hs-definition'>dupInScope</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Type</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-34"></a><span class='hs-definition'>dupInScope</span> <span class='hs-varid'>n</span> <span class='hs-varid'>n'</span> <span class='hs-keyword'>_</span>
<a name="line-35"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hang</span> <span class='hs-layout'>(</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"The scoped type variables"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"and"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>quotes</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>n'</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-36"></a>       <span class='hs-num'>2</span> <span class='hs-layout'>(</span><span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"are bound to the same type (variable)"</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-37"></a>		<span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Distinct scoped type variables must be distinct"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="wrongPredErr"></a><span class='hs-definition'>wrongPredErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HsPred</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsType</span> <span class='hs-conid'>Name</span><span class='hs-layout'>,</span> <span class='hs-conid'>TcKind</span><span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-definition'>wrongPredErr</span> <span class='hs-varid'>pred</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>failWithTc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"Predicate used as a type:"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>pred</span><span class='hs-layout'>)</span>
</pre>\end{code}

</body>
</html>