GHC 9 下类型类量化约束行为变动及可行解决方案咨询
可行解决方法
以下两种方案均可在GHC 9.x版本正常编译通过,需提前开启三个GHC扩展:StandaloneDeriving、QuantifiedConstraints、UndecidableInstances。
方案1:复用已有Eq实例约束
直接在Ord实例的上下文中引用已经定义好的Eq (A f)约束,避免重复编写Eq对应的量化约束:
newtype A f = A (f Int) deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f) deriving instance (Eq (A f), forall a. Ord a => Ord (f a)) => Ord (A f)
方案2:打包约束同义词
如果需要在多处使用这类带超类的量化约束,可以定义约束同义词把Eq、Ord的量化约束打包,明确告知GHC两者的超类关系:
type Eq1 f = forall a. Eq a => Eq (f a) type Ord1 f = (Eq1 f, forall a. Ord a => Ord (f a)) newtype A f = A (f Int) deriving instance Eq1 f => Eq (A f) deriving instance Ord1 f => Ord (A f)
问题原因
GHC 9 收紧了量化约束的上下文推导规则,不会自动跨两个独立的量化约束推导超类关系,因此原写法中Ord实例上下文里的两个独立量化约束无法被GHC关联,导致推导失败。
内容的提问来源于stack exchange,提问作者oisdk
相关产品推荐
相关产品推荐

