类型族和派生实例(Eq)



如果有额外的帮助,例如Eq a,是否可以导出B a的Eq实例?

{-# LANGUAGE TypeFamilies #-}
class A a where
  type B a 
  somef :: a -> B a -> B a -> Bool

使用类型族派生实例和类型族的实例定义的问题已经结束。以下内容在type B a行上不起作用,也没有类似的修改(或者只是尝试了错误的修改)。

{-# LANGUAGE StandaloneDeriving #-}
-- deriving instance Eq (B a) -- illegal application
-- deriving instance Eq a => Eq (B a) -- illegal application

约束Eq a => A a没有帮助。向somef添加约束编译(somef :: Eq a => ...)并适用于此方法。然而,在这种情况下,最好能够说明type B a在一般情况下是相等的(因此不允许不相等的BA),而不是逐个方法。

我认为这就成功了。。。

{-# LANGUAGE TypeFamilies, FlexibleContexts #-}
class Eq (B a) => A a where
  type B a 
  somef :: a -> B a -> B a -> Bool

作为其工作的验证,以下实例被接受

data HasEqInstance = HasEqInstance deriving Eq
instance A () where
  type B () = HasEqInstance
  somef = undefined

但这个被No instance for (Eq NoEqInstance) 拒绝了

data NoEqInstance = NoEqInstance
instance A () where
  type B () = NoEqInstance
  somef = undefined

最新更新