使用量化限制条件,我可以成功推导出Eq (A f)
?但是,当我尝试推导Ord (A f)
时失败了。我不理解在约束类具有超类时如何使用量化约束条件。如何推导出Ord (A f)
和其他具有超类的类?
> newtype A f = A (f Int)
> deriving instance (forall a. Eq a => Eq (f a)) => Eq (A f)
> deriving instance (forall a. Ord a => Ord (f a)) => Ord (A f)
<interactive>:3:1: error:
• Could not deduce (Ord a)
arising from the superclasses of an instance declaration
from the context: forall a. Ord a => Ord (f a)
bound by the instance declaration at <interactive>:3:1-61
or from: Eq a bound by a quantified context at <interactive>:1:1
Possible fix: add (Ord a) to the context of a quantified context
• In the instance declaration for 'Ord (A f)'
顺便提一下,我还研究了ghc提案0109-量化约束。使用的是ghc 8.6.5
deriving instance (forall a. (Eq a, Ord a) => (Eq (f a), Ord (f a))) => Ord (A f)
上非常接近了。你知道为什么会有差异吗? - William Rusnackforall a. Eq a => Eq (f a)
。从逻辑上看,(A /\ B) => (C /\ D)
不意味着A => C
。 - Li-yao Xiaforall a. Ord a => Ord (f a)
。 - Li-yao Xia