问题是Eq
是一个超类Ord
,以及约束(forall a. Ord a => Ord (f a))
不涉及超类约束Eq (A f)
需要声明一个Ord (A f)
实例。
We have (forall a. Ord a => Ord (f a))
We need Eq (A f)
, i.e., (forall a. Eq a => Eq (f a))
,这并不是我们所拥有的暗示。
解决办法:添加(forall a. Eq a => Eq (f a))
to the Ord
实例。
(我实际上不明白 GHC 给出的错误消息与问题有何关系。)
{-# LANGUAGE QuantifiedConstraints, StandaloneDeriving, UndecidableInstances, FlexibleContexts #-}
newtype A f = A (f Int)
deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f)
deriving instance (forall a. Eq a => Eq (f a), forall a. Ord a => Ord (f a)) => Ord (A f)
或者更整洁一点:
{-# LANGUAGE ConstraintKinds, RankNTypes, KindSignatures, QuantifiedConstraints, StandaloneDeriving, UndecidableInstances, FlexibleContexts #-}
import Data.Kind (Constraint)
type Eq1 f = (forall a. Eq a => Eq (f a) :: Constraint)
type Ord1 f = (forall a. Ord a => Ord (f a) :: Constraint) -- I also wanted to put Eq1 in here but was getting some impredicativity errors...
-----
newtype A f = A (f Int)
deriving instance Eq1 f => Eq (A f)
deriving instance (Eq1 f, Ord1 f) => Ord (A f)