考虑到以下类型,我应该如何实现 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)——以一种不需要扩展的更整洁的方式,例如 FlexibleContexts
或 UndecidableInstances
。
是的。
目前,没有 GHC 提供的 Eq1
派生。这是一个 libraries mailing list discussion of that matter 。
我相信“兼容”的存在仅仅是因为该库还提供了最近 GHC 确实为旧 GHC 提供的实例的推导。
关于haskell - Eq1/Ord1 类型类的目的和语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42449584/