Skip to content
  • Simon Peyton Jones's avatar
    [project @ 2000-10-03 08:43:00 by simonpj] · 710e2074
    Simon Peyton Jones authored
    --------------------------------------
    	Adding generics		SLPJ Oct 2000
    	--------------------------------------
    
    This big commit adds Hinze/PJ-style generic class definitions, based
    on work by Andrei Serjantov.  For example:
    
      class Bin a where
        toBin   :: a -> [Int]
        fromBin :: [Int] -> (a, [Int])
    
        toBin {| Unit |}    Unit	  = []
        toBin {| a :+: b |} (Inl x)   = 0 : toBin x
        toBin {| a :+: b |} (Inr y)   = 1 : toBin y
        toBin {| a :*: b |} (x :*: y) = toBin x ++ toBin y
    
    
        fromBin {| Unit |}    bs      = (Unit, bs)
        fromBin {| a :+: b |} (0:bs)  = (Inl x, bs')    where (x,bs') = fromBin bs
        fromBin {| a :+: b |} (1:bs)  = (Inr y, bs')    where (y,bs') = fromBin bs
        fromBin {| a :*: b |} bs  	  = (x :*: y, bs'') where (x,bs' ) = fromBin bs
    							  (y,bs'') = fromBin bs'
    
    Now we can say simply
    
      instance Bin a => Bin [a]
    
    and the compiler will derive the appropriate code automatically.
    
    		(About 9k lines of diffs.  Ha!)
    
    
    Generic related things
    ~~~~~~~~~~~~~~~~~~~~~~
    
    * basicTypes/BasicTypes: The EP type (embedding-projection pairs)
    
    * types/TyCon:
    	An extra field in an algebraic tycon (genInfo)
    
    * types/Class, and hsSyn/HsBinds:
    	Each class op (or ClassOpSig) carries information about whether
    	it  	a) has no default method
    		b) has a polymorphic default method
    		c) has a generic default method
    	There's a new data type for this: Class.DefMeth
    
    * types/Generics:
    	A new module containing good chunk of the generic-related code
    	It has a .hi-boot file (alas).
    
    * typecheck/TcInstDcls, typecheck/TcClassDcl:
    	Most of the rest of the generics-related code
    
    * hsSyn/HsTypes:
    	New infix type form to allow types of the form
    		data a :+: b = Inl a | Inr b
    
    * parser/Parser.y, Lex.lhs, rename/ParseIface.y:
    	Deal with the new syntax
    
    * prelude/TysPrim, TysWiredIn:
    	Need to generate generic stuff for the wired-in TyCons
    
    * rename/RnSource RnBinds:
    	A rather gruesome hack to deal with scoping of type variables
    	from a generic patterns.  Details commented in the ClassDecl
    	case of RnSource.rnDecl.
    
    	Of course, there are many minor renamer consequences of the
    	other changes above.
    
    * lib/std/PrelBase.lhs
    	Data type declarations for Unit, :+:, :*:
    
    
    Slightly unrelated housekeeping
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    * hsSyn/HsDecls:
    	ClassDecls now carry the Names for their implied declarations
    	(superclass selectors, tycon, etc) in a list, rather than
    	laid out one by one.  This simplifies code between the parser
    	and the type checker.
    
    * prelude/PrelNames, TysWiredIn:
    	All the RdrNames are now together in PrelNames.
    
    * utils/ListSetOps:
    	Add finite mappings based on equality and association lists (Assoc a b)
    	Move stuff from List.lhs that is related
    710e2074