I\'m playing around with the ConstraintKinds
extension of GHC.
I have the following data type, which is just a box for things fulfilling some one parameter constrai
The new QuantifiedConstraints
extension allows this.
class (a => b) => Implies a b where
instance (a => b) => Implies a b where
instance (forall a. c a `Implies` Show a) => Show (Some c) where
show (Some x) = show x
Within the body of the Show
instance, it is as if there is a
instance forall a. Implies (c a) (Show a)
in scope. If you then have T :: Type
and know c T
, then the superclass of c T => Show T
of the specialized Implies (c T) (Show T)
instance allows you to derive Show T
. It is necessary to use Implies
instead of a straight forall a. c a => Show a
constraint. This incorrect constraint acts like
instance forall a. c a => Show a
which overlaps with every Show
instance, causing weird breakage. Forcing an indirection through the superclass of an otherwise useless constraint fixes everything.