Make scoped type variables work for default methods
[ghc-hetmet.git] / compiler / typecheck / TcInstDcls.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[TcInstDecls]{Typechecking instance declarations}
5
6 \begin{code}
7 module TcInstDcls ( tcInstDecls1, tcInstDecls2 ) where
8
9 #include "HsVersions.h"
10
11 import HsSyn
12 import TcBinds          ( mkPragFun, tcPrags, badBootDeclErr )
13 import TcClassDcl       ( tcMethodBind, mkMethodBind, badMethodErr, 
14                           tcClassDecl2, getGenericInstances )
15 import TcRnMonad       
16 import TcMType          ( tcSkolSigType, checkValidInstance, checkValidInstHead )
17 import TcType           ( mkClassPred, tcSplitSigmaTy, tcSplitDFunHead, mkTyVarTys,
18                           SkolemInfo(InstSkol), tcSplitDFunTy )
19 import Inst             ( tcInstClassOp, newDicts, instToId, showLIE, 
20                           getOverlapFlag, tcExtendLocalInstEnv )
21 import InstEnv          ( mkLocalInstance, instanceDFunId )
22 import TcDeriv          ( tcDeriving )
23 import TcEnv            ( InstInfo(..), InstBindings(..), 
24                           newDFunName, tcExtendIdEnv
25                         )
26 import TcHsType         ( kcHsSigType, tcHsKindedType )
27 import TcUnify          ( checkSigTyVars )
28 import TcSimplify       ( tcSimplifyCheck, tcSimplifySuperClasses )
29 import Type             ( zipOpenTvSubst, substTheta, substTys )
30 import DataCon          ( classDataCon )
31 import Class            ( classBigSig )
32 import Var              ( Id, idName, idType )
33 import MkId             ( mkDictFunId )
34 import Name             ( Name, getSrcLoc )
35 import Maybe            ( catMaybes )
36 import SrcLoc           ( srcLocSpan, unLoc, noLoc, Located(..), srcSpanStart )
37 import ListSetOps       ( minusList )
38 import Outputable
39 import Bag
40 import BasicTypes       ( Activation( AlwaysActive ), InlineSpec(..) )
41 import FastString
42 \end{code}
43
44 Typechecking instance declarations is done in two passes. The first
45 pass, made by @tcInstDecls1@, collects information to be used in the
46 second pass.
47
48 This pre-processed info includes the as-yet-unprocessed bindings
49 inside the instance declaration.  These are type-checked in the second
50 pass, when the class-instance envs and GVE contain all the info from
51 all the instance and value decls.  Indeed that's the reason we need
52 two passes over the instance decls.
53
54
55 Here is the overall algorithm.
56 Assume that we have an instance declaration
57
58     instance c => k (t tvs) where b
59
60 \begin{enumerate}
61 \item
62 $LIE_c$ is the LIE for the context of class $c$
63 \item
64 $betas_bar$ is the free variables in the class method type, excluding the
65    class variable
66 \item
67 $LIE_cop$ is the LIE constraining a particular class method
68 \item
69 $tau_cop$ is the tau type of a class method
70 \item
71 $LIE_i$ is the LIE for the context of instance $i$
72 \item
73 $X$ is the instance constructor tycon
74 \item
75 $gammas_bar$ is the set of type variables of the instance
76 \item
77 $LIE_iop$ is the LIE for a particular class method instance
78 \item
79 $tau_iop$ is the tau type for this instance of a class method
80 \item
81 $alpha$ is the class variable
82 \item
83 $LIE_cop' = LIE_cop [X gammas_bar / alpha, fresh betas_bar]$
84 \item
85 $tau_cop' = tau_cop [X gammas_bar / alpha, fresh betas_bar]$
86 \end{enumerate}
87
88 ToDo: Update the list above with names actually in the code.
89
90 \begin{enumerate}
91 \item
92 First, make the LIEs for the class and instance contexts, which means
93 instantiate $thetaC [X inst_tyvars / alpha ]$, yielding LIElistC' and LIEC',
94 and make LIElistI and LIEI.
95 \item
96 Then process each method in turn.
97 \item
98 order the instance methods according to the ordering of the class methods
99 \item
100 express LIEC' in terms of LIEI, yielding $dbinds_super$ or an error
101 \item
102 Create final dictionary function from bindings generated already
103 \begin{pseudocode}
104 df = lambda inst_tyvars
105        lambda LIEI
106          let Bop1
107              Bop2
108              ...
109              Bopn
110          and dbinds_super
111               in <op1,op2,...,opn,sd1,...,sdm>
112 \end{pseudocode}
113 Here, Bop1 \ldots Bopn bind the methods op1 \ldots opn,
114 and $dbinds_super$ bind the superclass dictionaries sd1 \ldots sdm.
115 \end{enumerate}
116
117
118 %************************************************************************
119 %*                                                                      *
120 \subsection{Extracting instance decls}
121 %*                                                                      *
122 %************************************************************************
123
124 Gather up the instance declarations from their various sources
125
126 \begin{code}
127 tcInstDecls1    -- Deal with both source-code and imported instance decls
128    :: [LTyClDecl Name]          -- For deriving stuff
129    -> [LInstDecl Name]          -- Source code instance decls
130    -> TcM (TcGblEnv,            -- The full inst env
131            [InstInfo],          -- Source-code instance decls to process; 
132                                 -- contains all dfuns for this module
133            HsValBinds Name)     -- Supporting bindings for derived instances
134
135 tcInstDecls1 tycl_decls inst_decls
136   = checkNoErrs $
137         -- Stop if addInstInfos etc discovers any errors
138         -- (they recover, so that we get more than one error each round)
139
140         -- (1) Do the ordinary instance declarations
141     mappM tcLocalInstDecl1 inst_decls    `thenM` \ local_inst_infos ->
142
143     let
144         local_inst_info = catMaybes local_inst_infos
145         clas_decls      = filter (isClassDecl.unLoc) tycl_decls
146     in
147         -- (2) Instances from generic class declarations
148     getGenericInstances clas_decls      `thenM` \ generic_inst_info -> 
149
150         -- Next, construct the instance environment so far, consisting of
151         --      a) local instance decls
152         --      b) generic instances
153     addInsts local_inst_info    $
154     addInsts generic_inst_info  $
155
156         -- (3) Compute instances from "deriving" clauses; 
157         -- This stuff computes a context for the derived instance decl, so it
158         -- needs to know about all the instances possible; hence inst_env4
159     tcDeriving tycl_decls       `thenM` \ (deriv_inst_info, deriv_binds) ->
160     addInsts deriv_inst_info    $
161
162     getGblEnv                   `thenM` \ gbl_env ->
163     returnM (gbl_env, 
164              generic_inst_info ++ deriv_inst_info ++ local_inst_info,
165              deriv_binds)
166
167 addInsts :: [InstInfo] -> TcM a -> TcM a
168 addInsts infos thing_inside
169   = tcExtendLocalInstEnv (map iSpec infos) thing_inside
170 \end{code} 
171
172 \begin{code}
173 tcLocalInstDecl1 :: LInstDecl Name 
174                  -> TcM (Maybe InstInfo)        -- Nothing if there was an error
175         -- A source-file instance declaration
176         -- Type-check all the stuff before the "where"
177         --
178         -- We check for respectable instance type, and context
179 tcLocalInstDecl1 decl@(L loc (InstDecl poly_ty binds uprags))
180   =     -- Prime error recovery, set source location
181     recoverM (returnM Nothing)          $
182     setSrcSpan loc                      $
183     addErrCtxt (instDeclCtxt1 poly_ty)  $
184
185     do  { is_boot <- tcIsHsBoot
186         ; checkTc (not is_boot || (isEmptyLHsBinds binds && null uprags))
187                   badBootDeclErr
188
189         -- Typecheck the instance type itself.  We can't use 
190         -- tcHsSigType, because it's not a valid user type.
191         ; kinded_ty <- kcHsSigType poly_ty
192         ; poly_ty'  <- tcHsKindedType kinded_ty
193         ; let (tyvars, theta, tau) = tcSplitSigmaTy poly_ty'
194         
195         ; (clas, inst_tys) <- checkValidInstHead tau
196         ; checkValidInstance tyvars theta clas inst_tys
197
198         ; dfun_name <- newDFunName clas inst_tys (srcSpanStart loc)
199         ; overlap_flag <- getOverlapFlag
200         ; let dfun  = mkDictFunId dfun_name tyvars theta clas inst_tys
201               ispec = mkLocalInstance dfun overlap_flag
202
203         ; return (Just (InstInfo { iSpec = ispec, iBinds = VanillaInst binds uprags })) }
204 \end{code}
205
206
207 %************************************************************************
208 %*                                                                      *
209 \subsection{Type-checking instance declarations, pass 2}
210 %*                                                                      *
211 %************************************************************************
212
213 \begin{code}
214 tcInstDecls2 :: [LTyClDecl Name] -> [InstInfo] 
215              -> TcM (LHsBinds Id, TcLclEnv)
216 -- (a) From each class declaration, 
217 --      generate any default-method bindings
218 -- (b) From each instance decl
219 --      generate the dfun binding
220
221 tcInstDecls2 tycl_decls inst_decls
222   = do  {       -- (a) Default methods from class decls
223           (dm_binds_s, dm_ids_s) <- mapAndUnzipM tcClassDecl2 $
224                                     filter (isClassDecl.unLoc) tycl_decls
225         ; tcExtendIdEnv (concat dm_ids_s)       $ do 
226     
227                 -- (b) instance declarations
228         ; inst_binds_s <- mappM tcInstDecl2 inst_decls
229
230                 -- Done
231         ; let binds = unionManyBags dm_binds_s `unionBags` 
232                       unionManyBags inst_binds_s
233         ; tcl_env <- getLclEnv          -- Default method Ids in here
234         ; returnM (binds, tcl_env) }
235 \end{code}
236
237 ======= New documentation starts here (Sept 92)  ==============
238
239 The main purpose of @tcInstDecl2@ is to return a @HsBinds@ which defines
240 the dictionary function for this instance declaration.  For example
241 \begin{verbatim}
242         instance Foo a => Foo [a] where
243                 op1 x = ...
244                 op2 y = ...
245 \end{verbatim}
246 might generate something like
247 \begin{verbatim}
248         dfun.Foo.List dFoo_a = let op1 x = ...
249                                    op2 y = ...
250                                in
251                                    Dict [op1, op2]
252 \end{verbatim}
253
254 HOWEVER, if the instance decl has no context, then it returns a
255 bigger @HsBinds@ with declarations for each method.  For example
256 \begin{verbatim}
257         instance Foo [a] where
258                 op1 x = ...
259                 op2 y = ...
260 \end{verbatim}
261 might produce
262 \begin{verbatim}
263         dfun.Foo.List a = Dict [Foo.op1.List a, Foo.op2.List a]
264         const.Foo.op1.List a x = ...
265         const.Foo.op2.List a y = ...
266 \end{verbatim}
267 This group may be mutually recursive, because (for example) there may
268 be no method supplied for op2 in which case we'll get
269 \begin{verbatim}
270         const.Foo.op2.List a = default.Foo.op2 (dfun.Foo.List a)
271 \end{verbatim}
272 that is, the default method applied to the dictionary at this type.
273
274 What we actually produce in either case is:
275
276         AbsBinds [a] [dfun_theta_dicts]
277                  [(dfun.Foo.List, d)] ++ (maybe) [(const.Foo.op1.List, op1), ...]
278                  { d = (sd1,sd2, ..., op1, op2, ...)
279                    op1 = ...
280                    op2 = ...
281                  }
282
283 The "maybe" says that we only ask AbsBinds to make global constant methods
284 if the dfun_theta is empty.
285
286                 
287 For an instance declaration, say,
288
289         instance (C1 a, C2 b) => C (T a b) where
290                 ...
291
292 where the {\em immediate} superclasses of C are D1, D2, we build a dictionary
293 function whose type is
294
295         (C1 a, C2 b, D1 (T a b), D2 (T a b)) => C (T a b)
296
297 Notice that we pass it the superclass dictionaries at the instance type; this
298 is the ``Mark Jones optimisation''.  The stuff before the "=>" here
299 is the @dfun_theta@ below.
300
301 First comes the easy case of a non-local instance decl.
302
303
304 \begin{code}
305 tcInstDecl2 :: InstInfo -> TcM (LHsBinds Id)
306
307 tcInstDecl2 (InstInfo { iSpec = ispec, iBinds = binds })
308   = let 
309         dfun_id    = instanceDFunId ispec
310         rigid_info = InstSkol dfun_id
311         inst_ty    = idType dfun_id
312     in
313          -- Prime error recovery
314     recoverM (returnM emptyLHsBinds)            $
315     setSrcSpan (srcLocSpan (getSrcLoc dfun_id)) $
316     addErrCtxt (instDeclCtxt2 (idType dfun_id)) $
317
318         -- Instantiate the instance decl with skolem constants 
319     tcSkolSigType rigid_info inst_ty    `thenM` \ (inst_tyvars', dfun_theta', inst_head') ->
320                 -- These inst_tyvars' scope over the 'where' part
321                 -- Those tyvars are inside the dfun_id's type, which is a bit
322                 -- bizarre, but OK so long as you realise it!
323     let
324         (clas, inst_tys') = tcSplitDFunHead inst_head'
325         (class_tyvars, sc_theta, _, op_items) = classBigSig clas
326
327         -- Instantiate the super-class context with inst_tys
328         sc_theta' = substTheta (zipOpenTvSubst class_tyvars inst_tys') sc_theta
329         origin    = SigOrigin rigid_info
330     in
331          -- Create dictionary Ids from the specified instance contexts.
332     newDicts InstScOrigin sc_theta'                     `thenM` \ sc_dicts ->
333     newDicts origin dfun_theta'                         `thenM` \ dfun_arg_dicts ->
334     newDicts origin [mkClassPred clas inst_tys']        `thenM` \ [this_dict] ->
335                 -- Default-method Ids may be mentioned in synthesised RHSs,
336                 -- but they'll already be in the environment.
337
338         -- Typecheck the methods
339     let         -- These insts are in scope; quite a few, eh?
340         avail_insts = [this_dict] ++ dfun_arg_dicts ++ sc_dicts
341     in
342     tcMethods origin clas inst_tyvars' 
343               dfun_theta' inst_tys' avail_insts 
344               op_items binds            `thenM` \ (meth_ids, meth_binds) ->
345
346         -- Figure out bindings for the superclass context
347         -- Don't include this_dict in the 'givens', else
348         -- sc_dicts get bound by just selecting  from this_dict!!
349     addErrCtxt superClassCtxt
350         (tcSimplifySuperClasses inst_tyvars'
351                          dfun_arg_dicts
352                          sc_dicts)      `thenM` \ sc_binds ->
353
354         -- It's possible that the superclass stuff might unified one
355         -- of the inst_tyavars' with something in the envt
356     checkSigTyVars inst_tyvars'         `thenM_`
357
358         -- Deal with 'SPECIALISE instance' pragmas 
359     let
360         specs = case binds of
361                   VanillaInst _ prags -> filter isSpecInstLSig prags
362                   other               -> []
363     in
364     tcPrags dfun_id specs                       `thenM` \ prags -> 
365     
366         -- Create the result bindings
367     let
368         dict_constr   = classDataCon clas
369         scs_and_meths = map instToId sc_dicts ++ meth_ids
370         this_dict_id  = instToId this_dict
371         inline_prag | null dfun_arg_dicts = []
372                     | otherwise = [InlinePrag (Inline AlwaysActive True)]
373                 -- Always inline the dfun; this is an experimental decision
374                 -- because it makes a big performance difference sometimes.
375                 -- Often it means we can do the method selection, and then
376                 -- inline the method as well.  Marcin's idea; see comments below.
377                 --
378                 -- BUT: don't inline it if it's a constant dictionary;
379                 -- we'll get all the benefit without inlining, and we get
380                 -- a **lot** of code duplication if we inline it
381                 --
382                 --      See Note [Inline dfuns] below
383
384         dict_rhs
385           = mkHsConApp dict_constr inst_tys' (map HsVar scs_and_meths)
386                 -- We don't produce a binding for the dict_constr; instead we
387                 -- rely on the simplifier to unfold this saturated application
388                 -- We do this rather than generate an HsCon directly, because
389                 -- it means that the special cases (e.g. dictionary with only one
390                 -- member) are dealt with by the common MkId.mkDataConWrapId code rather
391                 -- than needing to be repeated here.
392
393         dict_bind  = noLoc (VarBind this_dict_id dict_rhs)
394         all_binds  = dict_bind `consBag` (sc_binds `unionBags` meth_binds)
395
396         main_bind = noLoc $ AbsBinds
397                             inst_tyvars'
398                             (map instToId dfun_arg_dicts)
399                             [(inst_tyvars', dfun_id, this_dict_id, 
400                                             inline_prag ++ prags)] 
401                             all_binds
402     in
403     showLIE (text "instance")           `thenM_`
404     returnM (unitBag main_bind)
405
406
407 tcMethods origin clas inst_tyvars' dfun_theta' inst_tys' 
408           avail_insts op_items (VanillaInst monobinds uprags)
409   =     -- Check that all the method bindings come from this class
410     let
411         sel_names = [idName sel_id | (sel_id, _) <- op_items]
412         bad_bndrs = collectHsBindBinders monobinds `minusList` sel_names
413     in
414     mappM (addErrTc . badMethodErr clas) bad_bndrs      `thenM_`
415
416         -- Make the method bindings
417     let
418         mk_method_bind = mkMethodBind origin clas inst_tys' monobinds
419     in
420     mapAndUnzipM mk_method_bind op_items        `thenM` \ (meth_insts, meth_infos) ->
421
422         -- And type check them
423         -- It's really worth making meth_insts available to the tcMethodBind
424         -- Consider     instance Monad (ST s) where
425         --                {-# INLINE (>>) #-}
426         --                (>>) = ...(>>=)...
427         -- If we don't include meth_insts, we end up with bindings like this:
428         --      rec { dict = MkD then bind ...
429         --            then = inline_me (... (GHC.Base.>>= dict) ...)
430         --            bind = ... }
431         -- The trouble is that (a) 'then' and 'dict' are mutually recursive, 
432         -- and (b) the inline_me prevents us inlining the >>= selector, which
433         -- would unravel the loop.  Result: (>>) ends up as a loop breaker, and
434         -- is not inlined across modules. Rather ironic since this does not
435         -- happen without the INLINE pragma!  
436         --
437         -- Solution: make meth_insts available, so that 'then' refers directly
438         --           to the local 'bind' rather than going via the dictionary.
439         --
440         -- BUT WATCH OUT!  If the method type mentions the class variable, then
441         -- this optimisation is not right.  Consider
442         --      class C a where
443         --        op :: Eq a => a
444         --
445         --      instance C Int where
446         --        op = op
447         -- The occurrence of 'op' on the rhs gives rise to a constraint
448         --      op at Int
449         -- The trouble is that the 'meth_inst' for op, which is 'available', also
450         -- looks like 'op at Int'.  But they are not the same.
451     let
452         prag_fn        = mkPragFun uprags
453         all_insts      = avail_insts ++ catMaybes meth_insts
454         sig_fn n       = Just []        -- No scoped type variables, but every method has
455                                         -- a type signature, in effect, so that we check
456                                         -- the method has the right type
457         tc_method_bind = tcMethodBind inst_tyvars' dfun_theta' all_insts sig_fn prag_fn
458         meth_ids       = [meth_id | (_,meth_id,_) <- meth_infos]
459     in
460
461     mapM tc_method_bind meth_infos              `thenM` \ meth_binds_s ->
462    
463     returnM (meth_ids, unionManyBags meth_binds_s)
464
465
466 -- Derived newtype instances
467 tcMethods origin clas inst_tyvars' dfun_theta' inst_tys' 
468           avail_insts op_items (NewTypeDerived rep_tys)
469   = getInstLoc origin                           `thenM` \ inst_loc ->
470     mapAndUnzip3M (do_one inst_loc) op_items    `thenM` \ (meth_ids, meth_binds, rhs_insts) ->
471     
472     tcSimplifyCheck
473          (ptext SLIT("newtype derived instance"))
474          inst_tyvars' avail_insts rhs_insts     `thenM` \ lie_binds ->
475
476         -- I don't think we have to do the checkSigTyVars thing
477
478     returnM (meth_ids, lie_binds `unionBags` listToBag meth_binds)
479
480   where
481     do_one inst_loc (sel_id, _)
482         = -- The binding is like "op @ NewTy = op @ RepTy"
483                 -- Make the *binder*, like in mkMethodBind
484           tcInstClassOp inst_loc sel_id inst_tys'       `thenM` \ meth_inst ->
485
486                 -- Make the *occurrence on the rhs*
487           tcInstClassOp inst_loc sel_id rep_tys'        `thenM` \ rhs_inst ->
488           let
489              meth_id = instToId meth_inst
490           in
491           return (meth_id, noLoc (VarBind meth_id (nlHsVar (instToId rhs_inst))), rhs_inst)
492
493         -- Instantiate rep_tys with the relevant type variables
494         -- This looks a bit odd, because inst_tyvars' are the skolemised version
495         -- of the type variables in the instance declaration; but rep_tys doesn't
496         -- have the skolemised version, so we substitute them in here
497     rep_tys' = substTys subst rep_tys
498     subst    = zipOpenTvSubst inst_tyvars' (mkTyVarTys inst_tyvars')
499 \end{code}
500
501
502                 ------------------------------
503         [Inline dfuns] Inlining dfuns unconditionally
504                 ------------------------------
505
506 The code above unconditionally inlines dict funs.  Here's why.
507 Consider this program:
508
509     test :: Int -> Int -> Bool
510     test x y = (x,y) == (y,x) || test y x
511     -- Recursive to avoid making it inline.
512
513 This needs the (Eq (Int,Int)) instance.  If we inline that dfun
514 the code we end up with is good:
515
516     Test.$wtest =
517         \r -> case ==# [ww ww1] of wild {
518                 PrelBase.False -> Test.$wtest ww1 ww;
519                 PrelBase.True ->
520                   case ==# [ww1 ww] of wild1 {
521                     PrelBase.False -> Test.$wtest ww1 ww;
522                     PrelBase.True -> PrelBase.True [];
523                   };
524             };
525     Test.test = \r [w w1]
526             case w of w2 {
527               PrelBase.I# ww ->
528                   case w1 of w3 { PrelBase.I# ww1 -> Test.$wtest ww ww1; };
529             };
530
531 If we don't inline the dfun, the code is not nearly as good:
532
533     (==) = case PrelTup.$fEq(,) PrelBase.$fEqInt PrelBase.$fEqInt of tpl {
534               PrelBase.:DEq tpl1 tpl2 -> tpl2;
535             };
536     
537     Test.$wtest =
538         \r [ww ww1]
539             let { y = PrelBase.I#! [ww1]; } in
540             let { x = PrelBase.I#! [ww]; } in
541             let { sat_slx = PrelTup.(,)! [y x]; } in
542             let { sat_sly = PrelTup.(,)! [x y];
543             } in
544               case == sat_sly sat_slx of wild {
545                 PrelBase.False -> Test.$wtest ww1 ww;
546                 PrelBase.True -> PrelBase.True [];
547               };
548     
549     Test.test =
550         \r [w w1]
551             case w of w2 {
552               PrelBase.I# ww ->
553                   case w1 of w3 { PrelBase.I# ww1 -> Test.$wtest ww ww1; };
554             };
555
556 Why doesn't GHC inline $fEq?  Because it looks big:
557
558     PrelTup.zdfEqZ1T{-rcX-}
559         = \ @ a{-reT-} :: * @ b{-reS-} :: *
560             zddEq{-rf6-} _Ks :: {PrelBase.Eq{-23-} a{-reT-}}
561             zddEq1{-rf7-} _Ks :: {PrelBase.Eq{-23-} b{-reS-}} ->
562             let {
563               zeze{-rf0-} _Kl :: (b{-reS-} -> b{-reS-} -> PrelBase.Bool{-3c-})
564               zeze{-rf0-} = PrelBase.zeze{-01L-}@ b{-reS-} zddEq1{-rf7-} } in
565             let {
566               zeze1{-rf3-} _Kl :: (a{-reT-} -> a{-reT-} -> PrelBase.Bool{-3c-})
567               zeze1{-rf3-} = PrelBase.zeze{-01L-} @ a{-reT-} zddEq{-rf6-} } in
568             let {
569               zeze2{-reN-} :: ((a{-reT-}, b{-reS-}) -> (a{-reT-}, b{-reS-})-> PrelBase.Bool{-3c-})
570               zeze2{-reN-} = \ ds{-rf5-} _Ks :: (a{-reT-}, b{-reS-})
571                                ds1{-rf4-} _Ks :: (a{-reT-}, b{-reS-}) ->
572                              case ds{-rf5-}
573                              of wild{-reW-} _Kd { (a1{-rf2-} _Ks, a2{-reZ-} _Ks) ->
574                              case ds1{-rf4-}
575                              of wild1{-reX-} _Kd { (b1{-rf1-} _Ks, b2{-reY-} _Ks) ->
576                              PrelBase.zaza{-r4e-}
577                                (zeze1{-rf3-} a1{-rf2-} b1{-rf1-})
578                                (zeze{-rf0-} a2{-reZ-} b2{-reY-})
579                              }
580                              } } in     
581             let {
582               a1{-reR-} :: ((a{-reT-}, b{-reS-})-> (a{-reT-}, b{-reS-})-> PrelBase.Bool{-3c-})
583               a1{-reR-} = \ a2{-reV-} _Ks :: (a{-reT-}, b{-reS-})
584                             b1{-reU-} _Ks :: (a{-reT-}, b{-reS-}) ->
585                           PrelBase.not{-r6I-} (zeze2{-reN-} a2{-reV-} b1{-reU-})
586             } in
587               PrelBase.zdwZCDEq{-r8J-} @ (a{-reT-}, b{-reS-}) a1{-reR-} zeze2{-reN-})
588
589 and it's not as bad as it seems, because it's further dramatically
590 simplified: only zeze2 is extracted and its body is simplified.
591
592
593 %************************************************************************
594 %*                                                                      *
595 \subsection{Error messages}
596 %*                                                                      *
597 %************************************************************************
598
599 \begin{code}
600 instDeclCtxt1 hs_inst_ty 
601   = inst_decl_ctxt (case unLoc hs_inst_ty of
602                         HsForAllTy _ _ _ (L _ (HsPredTy pred)) -> ppr pred
603                         HsPredTy pred                    -> ppr pred
604                         other                            -> ppr hs_inst_ty)     -- Don't expect this
605 instDeclCtxt2 dfun_ty
606   = inst_decl_ctxt (ppr (mkClassPred cls tys))
607   where
608     (_,_,cls,tys) = tcSplitDFunTy dfun_ty
609
610 inst_decl_ctxt doc = ptext SLIT("In the instance declaration for") <+> quotes doc
611
612 superClassCtxt = ptext SLIT("When checking the super-classes of an instance declaration")
613 \end{code}