[project @ 2002-06-07 07:16:04 by chak]
[ghc-hetmet.git] / ghc / compiler / types / Generics.lhs
1 \begin{code}
2 module Generics ( mkTyConGenInfo, mkGenericRhs, 
3                   validGenericInstanceType, validGenericMethodType
4     ) where
5
6
7 import RnHsSyn          ( RenamedHsExpr )
8 import HsSyn            ( HsExpr(..), InPat(..), mkSimpleMatch, placeHolderType )
9
10 import Type             ( Type, isUnLiftedType, tyVarsOfType, tyVarsOfTypes,
11                           mkTyVarTys, mkForAllTys, mkTyConApp, 
12                           mkFunTy, isTyVarTy, getTyVar_maybe,
13                           funTyCon
14                         )
15 import TcType           ( tcSplitTyConApp_maybe, tcSplitSigmaTy, tcSplitSigmaTy )
16 import DataCon          ( DataCon, dataConOrigArgTys, dataConWrapId, isExistentialDataCon )
17
18 import TyCon            ( TyCon, tyConTyVars, tyConDataCons_maybe, 
19                           tyConGenInfo, isNewTyCon, newTyConRep, isBoxedTupleTyCon
20                         )
21 import Name             ( Name, mkSystemName )
22 import CoreSyn          ( mkLams, Expr(..), CoreExpr, AltCon(..), 
23                           mkConApp, Alt, mkTyApps, mkVarApps )
24 import CoreUtils        ( exprArity )
25 import BasicTypes       ( EP(..), Boxity(..) )
26 import Var              ( TyVar )
27 import VarSet           ( varSetElems )
28 import Id               ( Id, mkVanillaGlobal, idType, idName, mkSysLocal )
29 import MkId             ( mkReboxingAlt, mkNewTypeBody )
30 import TysWiredIn       ( genericTyCons,
31                           genUnitTyCon, genUnitDataCon, plusTyCon, inrDataCon,
32                           inlDataCon, crossTyCon, crossDataCon
33                         )
34 import IdInfo           ( noCafNoTyGenIdInfo, setUnfoldingInfo, setArityInfo )
35 import CoreUnfold       ( mkTopUnfolding ) 
36
37 import Maybe            ( isNothing )
38 import SrcLoc           ( builtinSrcLoc )
39 import Unique           ( Unique, builtinUniques, mkBuiltinUnique )
40 import Util             ( takeList, dropList )
41 import Outputable 
42 import FastString
43
44 #include "HsVersions.h"
45 \end{code}
46
47 Roadmap of what's where in the Generics work.
48 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
49
50 Parser
51 No real checks.
52
53 RnSource.rnHsType
54   Checks that HsNumTy has a "1" in it.
55
56 TcInstDcls.mkGenericInstance:
57   Checks for invalid type patterns, such as f {| Int |}
58
59 TcClassDcl.tcClassSig
60   Checks for a method type that is too complicated;
61         e.g. has for-alls or lists in it
62   We could lift this restriction
63
64 TcClassDecl.mkDefMethRhs
65   Checks that the instance type is simple, in an instance decl 
66   where we let the compiler fill in a generic method.
67         e.g.  instance C (T Int)
68         is not valid if C has generic methods.
69
70 TcClassDecl.checkGenericClassIsUnary
71   Checks that we don't have generic methods in a multi-parameter class
72
73 TcClassDecl.checkDefaultBinds
74   Checks that all the equations for a method in a class decl
75   are generic, or all are non-generic
76
77
78                         
79 Checking that the type constructors which are present in Generic
80 patterns (not Unit, this is done differently) is done in mk_inst_info
81 (TcInstDecls) in a call to tcHsType (TcMonoBinds). This means that
82 HsOpTy is tied to Generic definitions which is not a very good design
83 feature, indeed a bug. However, the check is easy to move from
84 tcHsType back to mk_inst_info and everything will be fine. Also see
85 bug #5. [I don't think that this is the case anymore after SPJ's latest
86 changes in that regard.  Delete this comment?  -=chak/7Jun2]
87
88 Generics.lhs
89
90 Making generic information to put into a tycon. Constructs the
91 representation type, which, I think, are not used later. Perhaps it is
92 worth removing them from the GI datatype. Although it does get used in
93 the construction of conversion functions (internally).
94
95 TyCon.lhs
96
97 Just stores generic information, accessible by tyConGenInfo or tyConGenIds.
98
99 TysWiredIn.lhs
100
101 Defines generic and other type and data constructors.
102
103 This is sadly incomplete, but will be added to.
104
105
106 Bugs & shortcomings of existing implementation:
107 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108
109 2. Another pretty big bug I dscovered at the last minute when I was
110 testing the code is that at the moment the type variable of the class
111 is scoped over the entire declaration, including the patterns. For
112 instance, if I have the following code,
113
114 class Er a where
115  ...
116   er {| Plus a b |} (Inl x) (Inl y) = er x y 
117   er {| Plus a b |} (Inr x) (Inr y) = er x y 
118   er {| Plus a b |} _ _ = False
119  
120 and I print out the types of the generic patterns, I get the
121 following.  Note that all the variable names for "a" are the same,
122 while for "b" they are all different.
123
124 check_ty
125     [std.Generics.Plus{-33u,i-} a{-r6Z-} b{-r7g-},
126      std.Generics.Plus{-33u,i-} a{-r6Z-} b{-r7m-},
127      std.Generics.Plus{-33u,i-} a{-r6Z-} b{-r7p-}]
128
129 This is a bug as if I change the code to
130
131  er {| Plus c b |} (Inl x)  (Inl y) = er x y 
132
133 all the names come out to be different.
134
135 Thus, all the types (Plus a b) come out to be different, so I cannot
136 compare them and test whether they are all the same and thus cannot
137 return an error if the type variables are different.
138
139 Temporary fix/hack. I am not checking for this, I just assume they are
140 the same, see line "check_ty = True" in TcInstDecls. When we resolve
141 the issue with variables, though - I assume that we will make them to
142 be the same in all the type patterns, jus uncomment the check and
143 everything should work smoothly.
144
145 Hence, I have also left the rather silly construction of:
146 * extracting all the type variables from all the types
147 * putting them *all* into the environment
148 * typechecking all the types
149 * selecting one of them and using it as the instance_ty.
150
151 (the alternative is to make sure that all the types are the same,
152 taking one, extracting its variables, putting them into the environment,
153 type checking it, using it as the instance_ty)
154  
155 6. What happens if we do not supply all of the generic patterns? At
156 the moment, the compiler crashes with an error message "Non-exhaustive
157 patterns in a generic declaration" 
158
159
160 What has not been addressed:
161 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
162
163 Contexts. In the generated instance declarations for the 3 primitive
164 type constructors, we need contexts. It is unclear what those should
165 be. At the moment, we always say eg. (Eq a, Eq b) => Eq (Plus a b)
166
167 Type application. We have type application in expressions
168 (essentially) on the lhs of an equation. Do we want to allow it on the
169 RHS?
170
171 Scoping of type variables in a generic definition. At the moment, (see
172 TcInstDecls) we extract the type variables inside the type patterns
173 and add them to the environment. See my bug #2 above. This seems pretty
174 important.
175
176
177
178 %************************************************************************
179 %*                                                                      *
180 \subsection{Getting the representation type out}
181 %*                                                                      *
182 %************************************************************************
183
184 \begin{code}
185 validGenericInstanceType :: Type -> Bool
186   -- Checks for validity of the type pattern in a generic
187   -- declaration.  It's ok to have  
188   --    f {| a + b |} ...
189   -- but it's not OK to have
190   --    f {| a + Int |}
191
192 validGenericInstanceType inst_ty
193   = case tcSplitTyConApp_maybe inst_ty of
194         Just (tycon, tys) ->  all isTyVarTy tys && tycon `elem` genericTyCons
195         Nothing           ->  False
196
197 validGenericMethodType :: Type -> Bool
198   -- At the moment we only allow method types built from
199   --    * type variables
200   --    * function arrow
201   --    * boxed tuples
202   --    * an arbitrary type not involving the class type variables
203   --            e.g. this is ok:        forall b. Ord b => [b] -> a
204   --                 where a is the class variable
205 validGenericMethodType ty 
206   = valid tau
207   where
208     (local_tvs, _, tau) = tcSplitSigmaTy ty
209
210     valid ty
211       | isTyVarTy ty    = True
212       | no_tyvars_in_ty = True
213       | otherwise       = case tcSplitTyConApp_maybe ty of
214                                 Just (tc,tys) -> valid_tycon tc && all valid tys
215                                 Nothing       -> False
216       where
217         no_tyvars_in_ty = all (`elem` local_tvs) (varSetElems (tyVarsOfType ty))
218
219     valid_tycon tc = tc == funTyCon || isBoxedTupleTyCon tc 
220         -- Compare bimapApp, below
221 \end{code}
222
223
224 %************************************************************************
225 %*                                                                      *
226 \subsection{Generating representation types}
227 %*                                                                      *
228 %************************************************************************
229
230 \begin{code}
231 mkTyConGenInfo :: TyCon -> [Name] -> Maybe (EP Id)
232 -- mkTyConGenInfo is called twice
233 --      once from TysWiredIn for Tuples
234 --      once the typechecker TcTyDecls 
235 -- to generate generic types and conversion functions for all datatypes.
236 -- 
237 -- Must only be called with an algebraic type.
238 -- 
239 -- The two names are the names constructed by the renamer
240 -- for the fromT and toT conversion functions.
241
242 mkTyConGenInfo tycon []
243   = Nothing     -- This happens when we deal with the interface-file type
244                 -- decl for a module compiled without -fgenerics
245
246 mkTyConGenInfo tycon [from_name, to_name]
247   | isNothing maybe_datacons    -- Abstractly imported types don't have
248   = Nothing                     -- to/from operations, (and should not need them)
249
250         -- If any of the constructor has an unboxed type as argument,
251         -- then we can't build the embedding-projection pair, because
252         -- it relies on instantiating *polymorphic* sum and product types
253         -- at the argument types of the constructors
254         -- Nor can we do the job if it's an existential data constructor,
255   | or [ any isUnLiftedType (dataConOrigArgTys dc) || isExistentialDataCon dc
256        | dc <- datacons ]
257   = Nothing
258
259   | null datacons       -- There are no constructors; 
260   = Nothing             -- there are no values of this type
261
262   | otherwise
263   = ASSERT( not (null datacons) )       -- mk_sum_stuff loops if no datacons
264     Just (EP { fromEP = mkVanillaGlobal from_name from_ty from_id_info,
265                toEP   = mkVanillaGlobal to_name   to_ty   to_id_info })
266   where
267     maybe_datacons = tyConDataCons_maybe tycon
268     Just datacons  = maybe_datacons             -- [C, D]
269
270     tyvars         = tyConTyVars tycon          -- [a, b, c]
271     tycon_ty       = mkTyConApp tycon tyvar_tys -- T a b c
272     tyvar_tys      = mkTyVarTys tyvars
273
274     from_id_info = noCafNoTyGenIdInfo `setUnfoldingInfo` mkTopUnfolding from_fn
275                                       `setArityInfo`     exprArity from_fn
276     to_id_info   = noCafNoTyGenIdInfo `setUnfoldingInfo` mkTopUnfolding to_fn
277                                       `setArityInfo`     exprArity to_fn
278         -- It's important to set the arity info, so that
279         -- the calling convention (gotten from arity) 
280         -- matches reality.
281
282     from_ty = mkForAllTys tyvars (mkFunTy tycon_ty rep_ty)
283     to_ty   = mkForAllTys tyvars (mkFunTy rep_ty tycon_ty)
284
285     (from_fn, to_fn, rep_ty) 
286         | isNewTyCon tycon
287         = ( mkLams tyvars $ Lam x  $ mkNewTypeBody tycon newrep_ty (Var x),
288             Var (dataConWrapId the_datacon),
289             newrep_ty )
290
291         | otherwise
292         = ( mkLams tyvars $ Lam x     $ Case (Var x) x from_alts,
293             mkLams tyvars $ Lam rep_var to_inner,
294             idType rep_var )
295
296     -- x :: T a b c
297     x = mkGenericLocal u1 tycon_ty
298     (u1 : uniqs) = builtinUniques
299
300             ----------------------
301             --  Newtypes only
302     [the_datacon]  = datacons
303     (_, newrep_ty) = newTyConRep tycon
304        
305             ----------------------
306             --  Non-newtypes only
307     -- Recurse over the sum first
308     -- The "2" is the first free unique
309     (from_alts, to_inner, rep_var) = mk_sum_stuff uniqs tyvars datacons
310     
311 mkTyConGenInfo tycon names = pprPanic "mkTyConGenInfo" (ppr tycon <+> ppr names)
312     
313
314 ----------------------------------------------------
315 --      Dealing with sums
316 ----------------------------------------------------
317 mk_sum_stuff :: [Unique]        -- Base for generating unique names
318              -> [TyVar]         -- Type variables over which the tycon is abstracted
319              -> [DataCon]       -- The data constructors
320              -> ([Alt Id], CoreExpr, Id)
321
322 -- For example, given
323 --      data T = C | D Int Int Int
324 -- 
325 -- mk_sum_stuff v [C,D] = ([C -> Inl Unit, D a b c -> Inr (a :*: (b :*: c))],
326 --                         case cd of { Inl u -> C; 
327 --                                      Inr abc -> case abc of { a :*: bc ->
328 --                                                 case bc  of { b :*: c ->
329 --                                                 D a b c }} },
330 --                         cd)
331
332 mk_sum_stuff us tyvars [datacon]
333    = ([from_alt], to_body_fn app_exp, rep_var)
334    where
335      types        = dataConOrigArgTys datacon   -- Existentials already excluded
336      datacon_vars = zipWith mkGenericLocal us types
337      us'          = dropList types us
338
339      app_exp      = mkVarApps (Var (dataConWrapId datacon)) (tyvars ++ datacon_vars)
340      from_alt     = mkReboxingAlt us' datacon datacon_vars from_alt_rhs
341                         -- We are talking about *user* datacons here; hence
342                         --      dataConWrapId
343                         --      mkReboxingAlt
344
345      (_,args',_)  = from_alt
346      us''         = dropList args' us'  -- Conservative, but safe
347      
348      (_, from_alt_rhs, to_body_fn, rep_var) = mk_prod_stuff us'' datacon_vars
349
350 mk_sum_stuff (u:us) tyvars datacons
351   = (wrap inlDataCon l_from_alts ++ wrap inrDataCon r_from_alts,
352      Case (Var rep_var) rep_var [(DataAlt inlDataCon, [l_rep_var], l_to_body),
353                                  (DataAlt inrDataCon, [r_rep_var], r_to_body)],
354      rep_var)
355   where
356     (l_datacons, r_datacons)            = splitInHalf datacons
357     (l_from_alts, l_to_body, l_rep_var) = mk_sum_stuff us tyvars l_datacons
358     (r_from_alts, r_to_body, r_rep_var) = mk_sum_stuff us tyvars r_datacons
359     rep_tys                             = [idType l_rep_var, idType r_rep_var]
360     rep_ty                              = mkTyConApp plusTyCon rep_tys
361     rep_var                             = mkGenericLocal u rep_ty
362
363     wrap :: DataCon -> [Alt Id] -> [Alt Id] 
364         -- Wrap an application of the Inl or Inr constructor round each alternative
365     wrap datacon alts
366         = [(dc, args, App datacon_app rhs) | (dc,args,rhs) <- alts]
367         where
368           datacon_app = mkTyApps (Var (dataConWrapId datacon)) rep_tys
369
370 ----------------------------------------------------
371 --      Dealing with products
372 ----------------------------------------------------
373 mk_prod_stuff :: [Unique]               -- Base for unique names
374               -> [Id]                   -- arg-ids; args of the original user-defined constructor
375                                         --      They are bound enclosing from_rhs
376                                         --      Please bind these in the to_body_fn 
377               -> ([Unique],             -- Depleted unique-name supply
378                   CoreExpr,             -- from-rhs: puts together the representation from the arg_ids
379                   CoreExpr -> CoreExpr, -- to_body_fn: takes apart the representation
380                   Id)                   -- The rep-id; please bind this to the representation
381
382 -- For example:
383 -- mk_prod_stuff [a,b,c] = ( a :*: (b :*: c),
384 --                           \x -> case abc of { a :*: bc ->
385 --                                 case bc  of { b :*: c  -> 
386 --                                 x,
387 --                           abc )
388
389 -- We need to use different uqiques in the branches 
390 -- because the returned to_body_fns are nested.  
391 -- Hence the returned unqique-name supply
392
393 mk_prod_stuff (u:us) []         -- Unit case
394   = (us,
395      Var (dataConWrapId genUnitDataCon),
396      \x -> x, 
397      mkGenericLocal u (mkTyConApp genUnitTyCon []))
398
399 mk_prod_stuff us [arg_var]      -- Singleton case
400   = (us, Var arg_var, \x -> x, arg_var)
401
402 mk_prod_stuff (u:us) arg_vars   -- Two or more
403   = (us'', 
404      mkConApp crossDataCon (map Type rep_tys ++ [l_alt_rhs, r_alt_rhs]),
405      \x -> Case (Var rep_var) rep_var 
406                 [(DataAlt crossDataCon, [l_rep_var, r_rep_var], l_to_body_fn (r_to_body_fn x))],
407      rep_var)
408   where
409     (l_arg_vars, r_arg_vars)             = splitInHalf arg_vars
410     (us', l_alt_rhs, l_to_body_fn, l_rep_var) = mk_prod_stuff us  l_arg_vars
411     (us'', r_alt_rhs, r_to_body_fn, r_rep_var) = mk_prod_stuff us' r_arg_vars
412     rep_var = mkGenericLocal u (mkTyConApp crossTyCon rep_tys)
413     rep_tys = [idType l_rep_var, idType r_rep_var]
414 \end{code}
415
416 A little utility function
417
418 \begin{code}
419 splitInHalf :: [a] -> ([a],[a])
420 splitInHalf list = (left, right)
421                  where
422                    half  = length list `div` 2
423                    left  = take half list
424                    right = drop half list
425
426 mkGenericLocal :: Unique -> Type -> Id
427 mkGenericLocal uniq ty = mkSysLocal FSLIT("g") uniq ty
428 \end{code}
429
430 %************************************************************************
431 %*                                                                      *
432 \subsection{Generating the RHS of a generic default method}
433 %*                                                                      *
434 %************************************************************************
435
436 Generating the Generic default method.  Uses the bimaps to generate the
437 actual method. All of this is rather incomplete, but it would be nice
438 to make even this work.  Example
439
440         class Foo a where
441           op :: Op a
442
443         instance Foo T
444
445 Then we fill in the RHS for op, RenamedHsExpr, by calling mkGenericRhs:
446
447         instance Foo T where
448            op = <mkGenericRhs op a T>
449
450 To do this, we generate a pair of RenamedHsExprs (EP toOp fromOp), where
451
452         toOp   :: Op Trep -> Op T
453         fromOp :: Op T    -> Op Trep
454
455 (the bimap) and then fill in the RHS with
456
457         instance Foo T where
458            op = toOp op
459
460 Remember, we're generating a RenamedHsExpr, so the result of all this
461 will be fed to the type checker.  So the 'op' on the RHS will be 
462 at the representation type for T, Trep.
463
464
465 A note about polymorphism.  Suppose the class op is polymorphic:
466
467         class Baz a where
468           op :: forall b. Ord b => a -> b -> b
469
470 Then we can still generate a bimap with
471
472         toOP :: forall b. (Trep -> b -> b) -> (T -> b -> b)
473
474 and fill in the instance decl thus
475
476         instance Foo T where
477            op = toOp op
478
479 By the time the type checker has done its stuff we'll get
480
481         instance Foo T where
482            op = \b. \dict::Ord b. toOp b (op Trep b dict)
483
484 \begin{code}
485 mkGenericRhs :: Id -> TyVar -> TyCon -> RenamedHsExpr
486 mkGenericRhs sel_id tyvar tycon
487   = HsApp (toEP bimap) (HsVar (idName sel_id))
488   where 
489         -- Initialising the "Environment" with the from/to functions
490         -- on the datatype (actually tycon) in question
491         Just (EP from to) = tyConGenInfo tycon  -- Caller checked this will succeed
492         ep                = EP (HsVar (idName from)) (HsVar (idName to)) 
493
494         -- Takes out the ForAll and the Class restrictions 
495         -- in front of the type of the method.
496         (_,_,op_ty) = tcSplitSigmaTy (idType sel_id)
497
498         -- Do it again!  This deals with the case where the method type 
499         -- is polymorphic -- see notes above
500         (local_tvs,_,final_ty) = tcSplitSigmaTy op_ty
501
502         -- Now we probably have a tycon in front
503         -- of us, quite probably a FunTyCon.
504         bimap = generate_bimap (tyvar, ep, local_tvs) final_ty
505
506 type EPEnv = (TyVar,            -- The class type variable
507               EP RenamedHsExpr, -- The EP it maps to
508               [TyVar]           -- Other in-scope tyvars; they have an identity EP
509              )
510
511 -------------------
512 generate_bimap :: EPEnv
513                -> Type
514                -> EP RenamedHsExpr
515 -- Top level case - splitting the TyCon.
516 generate_bimap env@(tv,ep,local_tvs) ty 
517   = case getTyVar_maybe ty of
518         Just tv1 |  tv == tv1 -> ep                             -- The class tyvar
519                  |  otherwise -> ASSERT( tv1 `elem` local_tvs)  -- One of the polymorphic tyvars of the method
520                                  idEP   
521         Nothing  -> bimapApp env (tcSplitTyConApp_maybe ty)
522
523 -------------------
524 bimapApp :: EPEnv -> Maybe (TyCon, [Type]) -> EP RenamedHsExpr
525 bimapApp env Nothing                = panic "TcClassDecl: Type Application!"
526 bimapApp env (Just (tycon, ty_args)) 
527   | tycon == funTyCon       = bimapArrow arg_eps
528   | isBoxedTupleTyCon tycon = bimapTuple arg_eps
529   | otherwise               =   -- Otherwise validGenericMethodType will 
530                                 -- have checked that the type is a constant type
531                               ASSERT( all (`elem` local_tvs) (varSetElems (tyVarsOfTypes ty_args)) )
532                               idEP
533     where
534       arg_eps = map (generate_bimap env) ty_args
535       (_,_,local_tvs) = env
536
537 -------------------
538 -- bimapArrow :: [EP a a', EP b b'] -> EP (a->b) (a'->b')
539 bimapArrow [ep1, ep2]
540   = EP { fromEP = mk_hs_lam [VarPatIn g1, VarPatIn g2] from_body, 
541          toEP   = mk_hs_lam [VarPatIn g1, VarPatIn g2] to_body }
542   where
543     from_body = fromEP ep2 `HsApp` (HsPar $ HsVar g1 `HsApp` (HsPar $ toEP   ep1 `HsApp` HsVar g2))
544     to_body   = toEP   ep2 `HsApp` (HsPar $ HsVar g1 `HsApp` (HsPar $ fromEP ep1 `HsApp` HsVar g2))
545
546 -------------------
547 bimapTuple eps 
548   = EP { fromEP = mk_hs_lam [tuple_pat] from_body,
549          toEP   = mk_hs_lam [tuple_pat] to_body }
550   where
551     names       = takeList eps genericNames
552     tuple_pat   = TuplePatIn (map VarPatIn names) Boxed
553     eps_w_names = eps `zip` names
554     to_body     = ExplicitTuple [toEP   ep `HsApp` HsVar g | (ep,g) <- eps_w_names] Boxed
555     from_body   = ExplicitTuple [fromEP ep `HsApp` HsVar g | (ep,g) <- eps_w_names] Boxed
556
557 -------------------
558 genericNames :: [Name]
559 genericNames = [mkSystemName (mkBuiltinUnique i) (mkFastString ('g' : show i)) | i <- [1..]]
560 (g1:g2:g3:_) = genericNames
561
562 mk_hs_lam pats body = HsPar (HsLam (mkSimpleMatch pats body placeHolderType builtinSrcLoc))
563
564 idEP :: EP RenamedHsExpr
565 idEP = EP idexpr idexpr
566      where
567        idexpr = mk_hs_lam [VarPatIn g3] (HsVar g3)
568 \end{code}