[GHC] #14332: Deriving clauses can have forall types

GHC ghc-devs at haskell.org
Mon Oct 9 08:33:49 UTC 2017


#14332: Deriving clauses can have forall types
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.2.1
  checker)                           |
      Resolution:                    |             Keywords:  deriving
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC accepts       |  Unknown/Multiple
  invalid program                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 > I intended to move the forall to the left of the context.

 Aha, that makes a huge difference. I thought you were advocating
 generating a derived instance like
 {{{
 instance ... => C (forall k. T k a) where ...
 }}}
 which would be bad.  (We don't allow that in source code, so we shouldn't
 in deriving-generated code.)

 But if you mean just moving the foralls to the left, then we've supported
 that for ages in the abstract syntax
 {{{
 data HsDerivingClause pass
   -- See Note [Deriving strategies] in TcDeriv
   = HsDerivingClause
     { deriv_clause_strategy :: Maybe (Located DerivStrategy)
       -- ^ The user-specified strategy (if any) to use when deriving
       -- 'deriv_clause_tys'.
     , deriv_clause_tys :: Located [LHsSigType pass]
       -- ^ The types to derive.
       --
       -- It uses 'LHsSigType's because, with
 @-XGeneralizedNewtypeDeriving@,
       -- we can mention type variables that aren't bound by the datatype,
 e.g.
       --
       -- > data T b = ... deriving (C [a])
       --
       -- should produce a derived instance for @C [a] (T b)@.
     }
 }}}
 Note the `LHsSigType` and comment.

 I'm not saying it's implemented right, and it appears to be undocumented
 in the user manual, but it's there by design.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14332#comment:5>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list