考虑以下类型,我应该如何实现Eq1实例?
data Foo a = Bar String | Baz a [a]
instance Eq1 Foo where
liftEq _ (Bar a) (Bar b) = a == b -- can't use f
liftEq f (Baz a aa) (Baz b bb) = f a b && liftEq f aa bb -- instance for lists
liftEq _ _ _ = False
上面的实例是否正确?我是否应该在GHC 8.0.2中手动实现它?有使用TH的derive-compat库,但为什么它被称为-compat?
最佳答案 Eq1和朋友的观点是提供约束,意味着与类型构造函数一起使用,类型构造函数采用类型构造函数 – 例如,monad变换器或Fix(参见
How to derive instances in recursion schemes) – 以更整洁的方式使用,不需要像FlexibleContexts这样的扩展或UndecidableInstances.
Is the instance above correct?
是的.
Am I supposed to implement it by hand in GHC 8.0.2?
目前,没有GHC提供的Eq1推导.这是libraries mailing list discussion of that matter.
There is
deriving-compat
library that uses TH, but why is it called-compat?
我认为“compat”仅仅是因为该图书馆还提供了近期GHC确实为较老的GHC提供的实例.