haskell – Eq1 / Ord1类型类的用途和语义

考虑以下类型,我应该如何实现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提供的实例.

点赞