考虑以下类型,我应该如何实现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中手动实现它?有deriving-compat
库使用TH,但为什么称为-compat
?
答案 0 :(得分:2)
Eq1
和朋友的观点是提供约束,意味着与带有类型构造函数的类型构造函数一起使用 - 例如,monad变换器或Fix
(cf. How to derive instances in recursion schemes) - 以更整洁的方式,不需要FlexibleContexts
或UndecidableInstances
等扩展名。
上面的实例是否正确?
是的,是的。
我是否应该在GHC 8.0.2中手动实施?
目前,没有GHC提供的Eq1
派生。这是libraries mailing list discussion of that matter。
有
deriving-compat
库使用TH,但为什么称为-compat?
我认为“compat”只是因为该图书馆还提供了最近的GHC确实为较老的GHC提供的实例。