• Simon Peyton Jones's avatar
    Fix DeriveAnyClass (Trac #9968) · af77089b
    Simon Peyton Jones authored
    The main issue concerned things like
    
       data T a = MkT a deriving( C Int )
    
    which is supposed to generate
    
       instance C Int (T a) where {}
    
    But the 'Int' argument (called cls_tys in the code) wasn't
    even being passed to inferConstraints and mk_data_eqn, so it
    really had no chance.   DeriveAnyClass came along after this
    code was written!
    
    Anyway I did quite a bit of tidying up in inferConstraints.
    
    Also I discovered that this case was not covered at all
    
       data T a b = MkT a b deriving( Bifunctor )
    
    What constraints should we generate for the instance context?
    We can deal with classes whose last arg has kind *, like Eq, Ord;
    or (* -> *), like Functor, Traversable.  But we really don't have
    a story for classes whose last arg has kind (* -> * -> *).
    
    So I augmented checkSideConditions to check for that and give
    a sensible error message.
    
    ToDo: update the user manual.
    af77089b
TcGenDeriv.hs 101 KB