是的,这是一个不寻常的“为什么这样做”的问题。 我有这段代码:
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE QuantifiedConstraints #-}
{-# LANGUAGE UndecidableInstances #-}
data F a = A (F a) | B (a (F a)) -- a :: * -> *
deriving instance (forall b. Eq b => Eq (a b)) => Eq (F a)
-- the following errors,asking me to add (Eq b) into the context
deriving instance (forall b. Eq (a b)) => Eq (F a)
如果定义第二个版本会出错
data T a = C | D a deriving Eq
x = B C == B C
从逻辑的角度来看,将(Eq b)
添加到约束应该类似于(forall b. Eq b && Eq (a b)) => Eq (F a)
,因为我们需要将其保留在forall
的范围内。可以想象,(Eq b)
是隐式假定的,就像大多数派生实例一样。但如果是这样,为什么第二个版本不起作用?