2 % (c) The AQUA Project, Glasgow University, 1996
4 \section[TcHsSyn]{Specialisations of the @HsSyn@ syntax for the typechecker}
6 This module is an extension of @HsSyn@ syntax, for use in the type
11 TcIdBndr(..), TcIdOcc(..),
13 TcMonoBinds(..), TcHsBinds(..), TcBind(..), TcPat(..),
14 TcExpr(..), TcGRHSsAndBinds(..), TcGRHS(..), TcMatch(..),
15 TcQual(..), TcStmt(..), TcArithSeqInfo(..), TcRecordBinds(..),
18 TypecheckedHsBinds(..), TypecheckedBind(..),
19 TypecheckedMonoBinds(..), TypecheckedPat(..),
20 TypecheckedHsExpr(..), TypecheckedArithSeqInfo(..),
21 TypecheckedQual(..), TypecheckedStmt(..),
22 TypecheckedMatch(..), TypecheckedHsModule(..),
23 TypecheckedGRHSsAndBinds(..), TypecheckedGRHS(..),
24 TypecheckedRecordBinds(..),
26 mkHsTyApp, mkHsDictApp,
27 mkHsTyLam, mkHsDictLam,
32 zonkId, -- TcIdBndr s -> NF_TcM s Id
33 unZonkId -- Id -> NF_TcM s (TcIdBndr s)
39 import HsSyn -- oodles of it
40 import Id ( GenId(..), IdDetails, PragmaInfo, -- Can meddle modestly with Ids
46 import TcType ( TcType(..), TcMaybe, TcTyVar(..),
47 zonkTcTypeToType, zonkTcTyVarToTyVar,
50 import Usage ( UVar(..) )
53 import PprType ( GenType, GenTyVar ) -- instances
54 import TyVar ( GenTyVar ) -- instances
55 import Unique ( Unique ) -- instances
62 The @Tc...@ datatypes are the ones that apply {\em during} type checking.
63 All the types in @Tc...@ things have mutable type-variables in them for
66 At the end of type checking we zonk everything to @Typechecked...@ datatypes,
67 which have immutable type variables in them.
70 type TcIdBndr s = GenId (TcType s) -- Binders are all TcTypes
71 data TcIdOcc s = TcId (TcIdBndr s) -- Bindees may be either
74 type TcHsBinds s = HsBinds (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
75 type TcBind s = Bind (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
76 type TcMonoBinds s = MonoBinds (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
77 type TcPat s = OutPat (TcTyVar s) UVar (TcIdOcc s)
78 type TcExpr s = HsExpr (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
79 type TcGRHSsAndBinds s = GRHSsAndBinds (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
80 type TcGRHS s = GRHS (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
81 type TcMatch s = Match (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
82 type TcQual s = Qual (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
83 type TcStmt s = Stmt (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
84 type TcArithSeqInfo s = ArithSeqInfo (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
85 type TcRecordBinds s = HsRecordBinds (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
86 type TcHsModule s = HsModule (TcTyVar s) UVar (TcIdOcc s) (TcPat s)
88 type TypecheckedPat = OutPat TyVar UVar Id
89 type TypecheckedMonoBinds = MonoBinds TyVar UVar Id TypecheckedPat
90 type TypecheckedHsBinds = HsBinds TyVar UVar Id TypecheckedPat
91 type TypecheckedBind = Bind TyVar UVar Id TypecheckedPat
92 type TypecheckedHsExpr = HsExpr TyVar UVar Id TypecheckedPat
93 type TypecheckedArithSeqInfo = ArithSeqInfo TyVar UVar Id TypecheckedPat
94 type TypecheckedQual = Qual TyVar UVar Id TypecheckedPat
95 type TypecheckedStmt = Stmt TyVar UVar Id TypecheckedPat
96 type TypecheckedMatch = Match TyVar UVar Id TypecheckedPat
97 type TypecheckedGRHSsAndBinds = GRHSsAndBinds TyVar UVar Id TypecheckedPat
98 type TypecheckedGRHS = GRHS TyVar UVar Id TypecheckedPat
99 type TypecheckedRecordBinds = HsRecordBinds TyVar UVar Id TypecheckedPat
100 type TypecheckedHsModule = HsModule TyVar UVar Id TypecheckedPat
104 mkHsTyApp expr [] = expr
105 mkHsTyApp expr tys = TyApp expr tys
107 mkHsDictApp expr [] = expr
108 mkHsDictApp expr dict_vars = DictApp expr dict_vars
110 mkHsTyLam [] expr = expr
111 mkHsTyLam tyvars expr = TyLam tyvars expr
113 mkHsDictLam [] expr = expr
114 mkHsDictLam dicts expr = DictLam dicts expr
116 tcIdType :: TcIdOcc s -> TcType s
117 tcIdType (TcId id) = idType id
118 tcIdType other = panic "tcIdType"
124 instance Eq (TcIdOcc s) where
125 (TcId id1) == (TcId id2) = id1 == id2
126 (RealId id1) == (RealId id2) = id1 == id2
128 instance Outputable (TcIdOcc s) where
129 ppr sty (TcId id) = ppr sty id
130 ppr sty (RealId id) = ppr sty id
132 instance NamedThing (TcIdOcc s) where
133 getName (TcId id) = getName id
134 getName (RealId id) = getName id
138 %************************************************************************
140 \subsection[BackSubst-HsBinds]{Running a substitution over @HsBinds@}
142 %************************************************************************
145 zonkId :: TcIdOcc s -> NF_TcM s Id
146 unZonkId :: Id -> NF_TcM s (TcIdBndr s)
148 zonkId (RealId id) = returnNF_Tc id
150 zonkId (TcId (Id u ty details prags info))
151 = zonkTcTypeToType ty `thenNF_Tc` \ ty' ->
152 returnNF_Tc (Id u ty' details prags info)
154 unZonkId (Id u ty details prags info)
155 = tcInstType [] ty `thenNF_Tc` \ ty' ->
156 returnNF_Tc (Id u ty' details prags info)
160 zonkInst :: (TcIdOcc s, TcExpr s) -> NF_TcM s (Id, TypecheckedHsExpr)
162 = zonkId id `thenNF_Tc` \ id' ->
163 zonkExpr expr `thenNF_Tc` \ expr' ->
164 returnNF_Tc (id', expr')
168 zonkBinds :: TcHsBinds s -> NF_TcM s TypecheckedHsBinds
170 zonkBinds EmptyBinds = returnNF_Tc EmptyBinds
172 zonkBinds (ThenBinds binds1 binds2)
173 = zonkBinds binds1 `thenNF_Tc` \ new_binds1 ->
174 zonkBinds binds2 `thenNF_Tc` \ new_binds2 ->
175 returnNF_Tc (ThenBinds new_binds1 new_binds2)
177 zonkBinds (SingleBind bind)
178 = zonkBind bind `thenNF_Tc` \ new_bind ->
179 returnNF_Tc (SingleBind new_bind)
181 zonkBinds (AbsBinds tyvars dicts locprs dict_binds val_bind)
182 = mapNF_Tc zonkTcTyVarToTyVar tyvars `thenNF_Tc` \ new_tyvars ->
183 mapNF_Tc zonkId dicts `thenNF_Tc` \ new_dicts ->
184 mapNF_Tc subst_pair locprs `thenNF_Tc` \ new_locprs ->
185 mapNF_Tc subst_bind dict_binds `thenNF_Tc` \ new_dict_binds ->
186 zonkBind val_bind `thenNF_Tc` \ new_val_bind ->
187 returnNF_Tc (AbsBinds new_tyvars new_dicts new_locprs new_dict_binds new_val_bind)
190 = zonkId l `thenNF_Tc` \ new_l ->
191 zonkId g `thenNF_Tc` \ new_g ->
192 returnNF_Tc (new_l, new_g)
195 = zonkId v `thenNF_Tc` \ new_v ->
196 zonkExpr e `thenNF_Tc` \ new_e ->
197 returnNF_Tc (new_v, new_e)
201 -------------------------------------------------------------------------
202 zonkBind :: TcBind s -> NF_TcM s TypecheckedBind
204 zonkBind EmptyBind = returnNF_Tc EmptyBind
206 zonkBind (NonRecBind mbinds)
207 = zonkMonoBinds mbinds `thenNF_Tc` \ new_mbinds ->
208 returnNF_Tc (NonRecBind new_mbinds)
210 zonkBind (RecBind mbinds)
211 = zonkMonoBinds mbinds `thenNF_Tc` \ new_mbinds ->
212 returnNF_Tc (RecBind new_mbinds)
214 -------------------------------------------------------------------------
215 zonkMonoBinds :: TcMonoBinds s -> NF_TcM s TypecheckedMonoBinds
217 zonkMonoBinds EmptyMonoBinds = returnNF_Tc EmptyMonoBinds
219 zonkMonoBinds (AndMonoBinds mbinds1 mbinds2)
220 = zonkMonoBinds mbinds1 `thenNF_Tc` \ new_mbinds1 ->
221 zonkMonoBinds mbinds2 `thenNF_Tc` \ new_mbinds2 ->
222 returnNF_Tc (AndMonoBinds new_mbinds1 new_mbinds2)
224 zonkMonoBinds (PatMonoBind pat grhss_w_binds locn)
225 = zonkPat pat `thenNF_Tc` \ new_pat ->
226 zonkGRHSsAndBinds grhss_w_binds `thenNF_Tc` \ new_grhss_w_binds ->
227 returnNF_Tc (PatMonoBind new_pat new_grhss_w_binds locn)
229 zonkMonoBinds (VarMonoBind var expr)
230 = zonkId var `thenNF_Tc` \ new_var ->
231 zonkExpr expr `thenNF_Tc` \ new_expr ->
232 returnNF_Tc (VarMonoBind new_var new_expr)
234 zonkMonoBinds (FunMonoBind name inf ms locn)
235 = zonkId name `thenNF_Tc` \ new_name ->
236 mapNF_Tc zonkMatch ms `thenNF_Tc` \ new_ms ->
237 returnNF_Tc (FunMonoBind new_name inf new_ms locn)
240 %************************************************************************
242 \subsection[BackSubst-Match-GRHSs]{Match and GRHSsAndBinds}
244 %************************************************************************
247 zonkMatch :: TcMatch s -> NF_TcM s TypecheckedMatch
249 zonkMatch (PatMatch pat match)
250 = zonkPat pat `thenNF_Tc` \ new_pat ->
251 zonkMatch match `thenNF_Tc` \ new_match ->
252 returnNF_Tc (PatMatch new_pat new_match)
254 zonkMatch (GRHSMatch grhss_w_binds)
255 = zonkGRHSsAndBinds grhss_w_binds `thenNF_Tc` \ new_grhss_w_binds ->
256 returnNF_Tc (GRHSMatch new_grhss_w_binds)
258 zonkMatch (SimpleMatch expr)
259 = zonkExpr expr `thenNF_Tc` \ new_expr ->
260 returnNF_Tc (SimpleMatch new_expr)
262 -------------------------------------------------------------------------
263 zonkGRHSsAndBinds :: TcGRHSsAndBinds s
264 -> NF_TcM s TypecheckedGRHSsAndBinds
266 zonkGRHSsAndBinds (GRHSsAndBindsOut grhss binds ty)
267 = mapNF_Tc zonk_grhs grhss `thenNF_Tc` \ new_grhss ->
268 zonkBinds binds `thenNF_Tc` \ new_binds ->
269 zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
270 returnNF_Tc (GRHSsAndBindsOut new_grhss new_binds new_ty)
272 zonk_grhs (GRHS guard expr locn)
273 = zonkExpr guard `thenNF_Tc` \ new_guard ->
274 zonkExpr expr `thenNF_Tc` \ new_expr ->
275 returnNF_Tc (GRHS new_guard new_expr locn)
277 zonk_grhs (OtherwiseGRHS expr locn)
278 = zonkExpr expr `thenNF_Tc` \ new_expr ->
279 returnNF_Tc (OtherwiseGRHS new_expr locn)
282 %************************************************************************
284 \subsection[BackSubst-HsExpr]{Running a zonkitution over a TypeCheckedExpr}
286 %************************************************************************
288 ToDo: panic on things that can't be in @TypecheckedHsExpr@.
291 zonkExpr :: TcExpr s -> NF_TcM s TypecheckedHsExpr
293 zonkExpr (HsVar name)
294 = zonkId name `thenNF_Tc` \ new_name ->
295 returnNF_Tc (HsVar new_name)
297 zonkExpr (HsLitOut lit ty)
298 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
299 returnNF_Tc (HsLitOut lit new_ty)
301 zonkExpr (HsLam match)
302 = zonkMatch match `thenNF_Tc` \ new_match ->
303 returnNF_Tc (HsLam new_match)
305 zonkExpr (HsApp e1 e2)
306 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
307 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
308 returnNF_Tc (HsApp new_e1 new_e2)
310 zonkExpr (OpApp e1 op e2)
311 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
312 zonkExpr op `thenNF_Tc` \ new_op ->
313 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
314 returnNF_Tc (OpApp new_e1 new_op new_e2)
316 zonkExpr (NegApp _) = panic "zonkExpr:NegApp"
317 zonkExpr (HsPar _) = panic "zonkExpr:HsPar"
319 zonkExpr (SectionL expr op)
320 = zonkExpr expr `thenNF_Tc` \ new_expr ->
321 zonkExpr op `thenNF_Tc` \ new_op ->
322 returnNF_Tc (SectionL new_expr new_op)
324 zonkExpr (SectionR op expr)
325 = zonkExpr op `thenNF_Tc` \ new_op ->
326 zonkExpr expr `thenNF_Tc` \ new_expr ->
327 returnNF_Tc (SectionR new_op new_expr)
329 zonkExpr (HsCase expr ms src_loc)
330 = zonkExpr expr `thenNF_Tc` \ new_expr ->
331 mapNF_Tc zonkMatch ms `thenNF_Tc` \ new_ms ->
332 returnNF_Tc (HsCase new_expr new_ms src_loc)
334 zonkExpr (HsIf e1 e2 e3 src_loc)
335 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
336 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
337 zonkExpr e3 `thenNF_Tc` \ new_e3 ->
338 returnNF_Tc (HsIf new_e1 new_e2 new_e3 src_loc)
340 zonkExpr (HsLet binds expr)
341 = zonkBinds binds `thenNF_Tc` \ new_binds ->
342 zonkExpr expr `thenNF_Tc` \ new_expr ->
343 returnNF_Tc (HsLet new_binds new_expr)
345 zonkExpr (HsDo _ _) = panic "zonkExpr:HsDo"
347 zonkExpr (HsDoOut stmts m_id mz_id src_loc)
348 = zonkStmts stmts `thenNF_Tc` \ new_stmts ->
349 zonkId m_id `thenNF_Tc` \ m_new ->
350 zonkId mz_id `thenNF_Tc` \ mz_new ->
351 returnNF_Tc (HsDoOut new_stmts m_new mz_new src_loc)
353 zonkExpr (ListComp expr quals)
354 = zonkExpr expr `thenNF_Tc` \ new_expr ->
355 zonkQuals quals `thenNF_Tc` \ new_quals ->
356 returnNF_Tc (ListComp new_expr new_quals)
358 zonkExpr (ExplicitList _) = panic "zonkExpr:ExplicitList"
360 zonkExpr (ExplicitListOut ty exprs)
361 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
362 mapNF_Tc zonkExpr exprs `thenNF_Tc` \ new_exprs ->
363 returnNF_Tc (ExplicitListOut new_ty new_exprs)
365 zonkExpr (ExplicitTuple exprs)
366 = mapNF_Tc zonkExpr exprs `thenNF_Tc` \ new_exprs ->
367 returnNF_Tc (ExplicitTuple new_exprs)
369 zonkExpr (RecordCon con rbinds)
370 = panic "zonkExpr:RecordCon"
371 zonkExpr (RecordUpd exp rbinds)
372 = panic "zonkExpr:RecordUpd"
373 zonkExpr (RecordUpdOut exp ids rbinds)
374 = panic "zonkExpr:RecordUpdOut"
376 zonkExpr (ExprWithTySig _ _) = panic "zonkExpr:ExprWithTySig"
377 zonkExpr (ArithSeqIn _) = panic "zonkExpr:ArithSeqIn"
379 zonkExpr (ArithSeqOut expr info)
380 = zonkExpr expr `thenNF_Tc` \ new_expr ->
381 zonkArithSeq info `thenNF_Tc` \ new_info ->
382 returnNF_Tc (ArithSeqOut new_expr new_info)
384 zonkExpr (CCall fun args may_gc is_casm result_ty)
385 = mapNF_Tc zonkExpr args `thenNF_Tc` \ new_args ->
386 zonkTcTypeToType result_ty `thenNF_Tc` \ new_result_ty ->
387 returnNF_Tc (CCall fun new_args may_gc is_casm new_result_ty)
389 zonkExpr (HsSCC label expr)
390 = zonkExpr expr `thenNF_Tc` \ new_expr ->
391 returnNF_Tc (HsSCC label new_expr)
393 zonkExpr (TyLam tyvars expr)
394 = mapNF_Tc zonkTcTyVarToTyVar tyvars `thenNF_Tc` \ new_tyvars ->
395 zonkExpr expr `thenNF_Tc` \ new_expr ->
396 returnNF_Tc (TyLam new_tyvars new_expr)
398 zonkExpr (TyApp expr tys)
399 = zonkExpr expr `thenNF_Tc` \ new_expr ->
400 mapNF_Tc zonkTcTypeToType tys `thenNF_Tc` \ new_tys ->
401 returnNF_Tc (TyApp new_expr new_tys)
403 zonkExpr (DictLam dicts expr)
404 = mapNF_Tc zonkId dicts `thenNF_Tc` \ new_dicts ->
405 zonkExpr expr `thenNF_Tc` \ new_expr ->
406 returnNF_Tc (DictLam new_dicts new_expr)
408 zonkExpr (DictApp expr dicts)
409 = zonkExpr expr `thenNF_Tc` \ new_expr ->
410 mapNF_Tc zonkId dicts `thenNF_Tc` \ new_dicts ->
411 returnNF_Tc (DictApp new_expr new_dicts)
413 zonkExpr (ClassDictLam dicts methods expr)
414 = mapNF_Tc zonkId dicts `thenNF_Tc` \ new_dicts ->
415 mapNF_Tc zonkId methods `thenNF_Tc` \ new_methods ->
416 zonkExpr expr `thenNF_Tc` \ new_expr ->
417 returnNF_Tc (ClassDictLam new_dicts new_methods new_expr)
419 zonkExpr (Dictionary dicts methods)
420 = mapNF_Tc zonkId dicts `thenNF_Tc` \ new_dicts ->
421 mapNF_Tc zonkId methods `thenNF_Tc` \ new_methods ->
422 returnNF_Tc (Dictionary new_dicts new_methods)
424 zonkExpr (SingleDict name)
425 = zonkId name `thenNF_Tc` \ new_name ->
426 returnNF_Tc (SingleDict new_name)
428 zonkExpr (HsCon con tys vargs)
429 = mapNF_Tc zonkTcTypeToType tys `thenNF_Tc` \ new_tys ->
430 mapNF_Tc zonkExpr vargs `thenNF_Tc` \ new_vargs ->
431 returnNF_Tc (HsCon con new_tys new_vargs)
433 -------------------------------------------------------------------------
434 zonkArithSeq :: TcArithSeqInfo s -> NF_TcM s TypecheckedArithSeqInfo
436 zonkArithSeq (From e)
437 = zonkExpr e `thenNF_Tc` \ new_e ->
438 returnNF_Tc (From new_e)
440 zonkArithSeq (FromThen e1 e2)
441 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
442 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
443 returnNF_Tc (FromThen new_e1 new_e2)
445 zonkArithSeq (FromTo e1 e2)
446 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
447 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
448 returnNF_Tc (FromTo new_e1 new_e2)
450 zonkArithSeq (FromThenTo e1 e2 e3)
451 = zonkExpr e1 `thenNF_Tc` \ new_e1 ->
452 zonkExpr e2 `thenNF_Tc` \ new_e2 ->
453 zonkExpr e3 `thenNF_Tc` \ new_e3 ->
454 returnNF_Tc (FromThenTo new_e1 new_e2 new_e3)
456 -------------------------------------------------------------------------
457 zonkQuals :: [TcQual s] -> NF_TcM s [TypecheckedQual]
460 = mapNF_Tc zonk_qual quals
462 zonk_qual (GeneratorQual pat expr)
463 = zonkPat pat `thenNF_Tc` \ new_pat ->
464 zonkExpr expr `thenNF_Tc` \ new_expr ->
465 returnNF_Tc (GeneratorQual new_pat new_expr)
467 zonk_qual (FilterQual expr)
468 = zonkExpr expr `thenNF_Tc` \ new_expr ->
469 returnNF_Tc (FilterQual new_expr)
471 zonk_qual (LetQual binds)
472 = zonkBinds binds `thenNF_Tc` \ new_binds ->
473 returnNF_Tc (LetQual new_binds)
475 -------------------------------------------------------------------------
476 zonkStmts :: [TcStmt s] -> NF_TcM s [TypecheckedStmt]
479 = mapNF_Tc zonk_stmt stmts
481 zonk_stmt (BindStmt pat expr src_loc)
482 = zonkPat pat `thenNF_Tc` \ new_pat ->
483 zonkExpr expr `thenNF_Tc` \ new_expr ->
484 returnNF_Tc (BindStmt new_pat new_expr src_loc)
486 zonk_stmt (ExprStmt expr src_loc)
487 = zonkExpr expr `thenNF_Tc` \ new_expr ->
488 returnNF_Tc (ExprStmt new_expr src_loc)
490 zonk_stmt (LetStmt binds)
491 = zonkBinds binds `thenNF_Tc` \ new_binds ->
492 returnNF_Tc (LetStmt new_binds)
495 %************************************************************************
497 \subsection[BackSubst-Pats]{Patterns}
499 %************************************************************************
502 zonkPat :: TcPat s -> NF_TcM s TypecheckedPat
505 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
506 returnNF_Tc (WildPat new_ty)
509 = zonkId v `thenNF_Tc` \ new_v ->
510 returnNF_Tc (VarPat new_v)
512 zonkPat (LazyPat pat)
513 = zonkPat pat `thenNF_Tc` \ new_pat ->
514 returnNF_Tc (LazyPat new_pat)
516 zonkPat (AsPat n pat)
517 = zonkId n `thenNF_Tc` \ new_n ->
518 zonkPat pat `thenNF_Tc` \ new_pat ->
519 returnNF_Tc (AsPat new_n new_pat)
521 zonkPat (ConPat n ty pats)
522 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
523 mapNF_Tc zonkPat pats `thenNF_Tc` \ new_pats ->
524 returnNF_Tc (ConPat n new_ty new_pats)
526 zonkPat (ConOpPat pat1 op pat2 ty)
527 = zonkPat pat1 `thenNF_Tc` \ new_pat1 ->
528 zonkPat pat2 `thenNF_Tc` \ new_pat2 ->
529 zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
530 returnNF_Tc (ConOpPat new_pat1 op new_pat2 new_ty)
532 zonkPat (ListPat ty pats)
533 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
534 mapNF_Tc zonkPat pats `thenNF_Tc` \ new_pats ->
535 returnNF_Tc (ListPat new_ty new_pats)
537 zonkPat (TuplePat pats)
538 = mapNF_Tc zonkPat pats `thenNF_Tc` \ new_pats ->
539 returnNF_Tc (TuplePat new_pats)
541 zonkPat (LitPat lit ty)
542 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
543 returnNF_Tc (LitPat lit new_ty)
545 zonkPat (NPat lit ty expr)
546 = zonkTcTypeToType ty `thenNF_Tc` \ new_ty ->
547 zonkExpr expr `thenNF_Tc` \ new_expr ->
548 returnNF_Tc (NPat lit new_ty new_expr)
550 zonkPat (DictPat ds ms)
551 = mapNF_Tc zonkId ds `thenNF_Tc` \ new_ds ->
552 mapNF_Tc zonkId ms `thenNF_Tc` \ new_ms ->
553 returnNF_Tc (DictPat new_ds new_ms)