[GHC] #10431: EqualityConstraints extension?
GHC
ghc-devs at haskell.org
Sat Dec 26 15:05:57 UTC 2015
#10431: EqualityConstraints extension?
-------------------------------------+-------------------------------------
Reporter: adamgundry | Owner:
Type: feature request | Status: new
Priority: normal | Milestone: 8.0.1
Component: Compiler (Type | Version: 7.11
checker) |
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by monoidal):
I like this idea, however, a proper implementation will have some
consequences. Can you review?
The intended result is that GADTs becomes a synonym for three extensions
(GADTSyntax, EqualityConstraints and ExistentialQuantification), and the
compiler never checks for -XGADTs, but always for one of the three flags.
1) Make GADTs imply ExistentialQuantification
This will mean that GADTs will enable syntax `data A = forall a. A a`.
2) Add EqualityConstraints extension
This extension will imply `MonoLocalBinds` and be implied by `GADTs` and
`TypeFamilies`. It will be checked in `check_eq_pred`.
The remaining work is removing two places where the compiler reads
`-XGADTs` flag.
3) Allow pattern matches on GADTs without `-XGADTs`
Currently pattern matching on GADTs requires `-XGADTs` or `-XTypeFamilies`
due to #2905. This restriction was made due to `-XRelaxedPolyRec` flag.
However, `-XRelaxedPolyRec` cannot be disabled since GHC 7.0, the original
motivation is lost. I suggest to remove the check altogether - generally
we check for flags at definition sites but not call sites.
4) Check for EqualityConstraints when defining a GADT
This step is optional and I'm not sure about it.
Consider this code
{{{
{-# LANGUAGE GADTSyntax, ExistentialQuantification #-}
data Eq a b where
Eq :: Eq a a
}}}
Currently this code compiles, however, it might be argued that
`-XEqualityConstraints` is needed here, since the same datatype in non-
GADT syntax requires it (`data Eq a b = a ~ b => Eq`) and `-XGADTSyntax`
is not supposed to add extra expressiveness. However, this change is not
backwards compatible and would probably require a deprecation period. The
rule would be that existentials and contexts require
`-XExistentialQuantification`, but if there is a specialized result type
it would require both `-XExistentialQuantification` and
`-XEqualityConstraints`.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10431#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list