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

时间:2017-02-24 22:48:14

标签: haskell

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

1 个答案:

答案 0 :(得分:2)

Eq1和朋友的观点是提供约束,意味着与带有类型构造函数的类型构造函数一起使用 - 例如,monad变换器或Fix(cf. How to derive instances in recursion schemes) - 以更整洁的方式,不需要FlexibleContextsUndecidableInstances等扩展名。

  

上面的实例是否正确?

是的,是的。

  

我是否应该在GHC 8.0.2中手动实施?

目前,没有GHC提供的Eq1派生。这是libraries mailing list discussion of that matter

  

deriving-compat库使用TH,但为什么称为-compat?

我认为“compat”只是因为该图书馆还提供了最近的GHC确实为较老的GHC提供的实例。