[GHC] #7543: Constraint synonym instances

GHC ghc-devs at haskell.org
Mon Mar 16 18:39:56 UTC 2015


#7543: Constraint synonym instances
-------------------------------------+-------------------------------------
        Reporter:  monoidal          |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  normal            |               Milestone:  7.12.1
       Component:  Compiler          |                 Version:  7.6.1
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
 Type of failure:  None/Unknown      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by bheklilr):

 I don't have a particular attachment to being able to do this, my biggest
 concern is that it's somewhat inconsistent behavior.  If a constraint
 isn't a class, then it shouldn't be possible to make an instance of it.
 Or we should allow all constraints to be instantiated as classes.  This
 could lead to some interesting problems to have to solve, such as when two
 constraints are used that could have overlapping names

 {{{
 module C1 where

 class C1 a where
     c :: a -> a
 }}}

 ----

 {{{
 module C2 where

 class C2 a where
     c :: a -> a
 }}}

 ----

 {{{
 module C where

 import C1
 import C2
 type Cs a = (C1 a, C2 a)

 instance Cs Int where
     C1.c = pred
     C2.c = succ
 }}}

 This won't work currently because you can't use qualified names in a
 binding position, but without the qualification you can't distinguish
 between the different `c` methods on the classes.  I also can't say I'm a
 fan of having multiple instances defined in the same block.  For example,
 the following would bother me

 {{{
 newtype MyInt = MyInt Int

 type OrdNum a = (Num a, Ord a)

 instance OrdNum MyInt where
     compare (MyInt x) (MyInt y) = compare x y
     fromInteger = MyInt
     ...
 -- Results in
 -- instance Num MyInt
 -- instance Ord MyInt
 }}}

 Considering that the argument for being able use constraints like this is
 that it would slightly improve the usability of a handful of libraries,
 I'm personally leaning towards a fix that would simply disallow instancing
 anything that is not a class.

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


More information about the ghc-tickets mailing list