如果有额外的帮助,例如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