[GHC] #16140: Cannot create type synonym for quantified constraint without ImpredicativeTypes

GHC ghc-devs at haskell.org
Tue Jan 8 10:16:42 UTC 2019


#16140: Cannot create type synonym for quantified constraint without
ImpredicativeTypes
-------------------------------------+-------------------------------------
        Reporter:  Ashley Yakeley    |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.3
      Resolution:                    |             Keywords:
                                     |  QuantifiedConstraints,
                                     |  ImpredicativeTypes
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Actually it might not be too hard.  The error message comes from
 `TcValidity`, by which time we know for sure what is a constraint and what
 is an ordinary tuple.

 Maybe, with `QuantifiedConstraints` we should simply accept polytypes at
 the top level of a constraint tuple.  Indeed, in types like `forall a.
 (pred1, pred2) => glah` we already do, when checking `pred1`, `pred2`:
 {{{
 check_pred_ty :: TidyEnv -> DynFlags -> UserTypeCtxt -> PredType -> TcM ()
 -- Check the validity of a predicate in a signature
 -- See Note [Validity checking for constraints]
 check_pred_ty env dflags ctxt pred
   = do { check_type env SigmaCtxt rank pred
        ; check_pred_help False env dflags ctxt pred }
   where
     rank | xopt LangExt.QuantifiedConstraints dflags
          = ArbitraryRank
          | otherwise
          = constraintMonoType
 }}}
 But we currently do not do this for the RHS of type synonyms of kind
 `Constraint`.

 Moreover, we you can see, `check_pred_ty` also does some extra validity
 checks on predicates, using `check_pred_help`.  (These checks are not
 described in a Note but probably should be.)  Example: require
 `TypeFamilies` for `t1 ~ t2`.

 We should probably do these exact same checks for the RHS of constraint
 synonyms.

 Proposal:

 * In `checkValidType`, if the kind of the type is `Constraint`, then use
 `check_pred_ty` rather than `check_type`.

 Do you agree?  Would you like to try that?

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


More information about the ghc-tickets mailing list