考虑到以下类型,我应该如何实现 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 的 deriving-compat 库,但为什么将其称为 -compat

最佳答案

Eq1 和friends 的重点是提供约束,这些约束旨在与采用类型构造函数的类型构造函数一起使用——例如,monad 转换器或 Fix(参见 How to derive instances in recursion schemes)——以一种不需要扩展的更整洁的方式,例如 FlexibleContextsUndecidableInstances



是的。



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



我相信“兼容”的存在仅仅是因为该库还提供了最近 GHC 确实为旧 GHC 提供的实例的推导。

关于haskell - Eq1/Ord1 类型类的目的和语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42449584/

10-12 03:10