Haskell 类型族和派生实例(Eq)

Haskell 类型族和派生实例(Eq),haskell,type-families,Haskell,Type Families,如果提供额外的帮助(例如,某个地方的Eq a),是否可以导出B a的Eq实例 {-# LANGUAGE TypeFamilies #-} class A a where type B a somef :: a -> B a -> B a -> Bool 问题和答案很接近。 以下内容不起作用,也没有对B型a-线进行类似的修改,或者只是尝试了错误的修改 {-# LANGUAGE StandaloneDeriving #-} -- deriving instance E

如果提供额外的帮助(例如,某个地方的Eq a),是否可以导出B a的Eq实例

{-# LANGUAGE TypeFamilies #-}

class A a where
  type B a 
  somef :: a -> B a -> B a -> Bool
问题和答案很接近。 以下内容不起作用,也没有对B型a-线进行类似的修改,或者只是尝试了错误的修改

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

约束Eq a=>a没有帮助。向somef添加约束会编译somef::Eq a=>。。。并且对这种方法有效。然而,在这种情况下,最好能够知道类型B a通常是可等式的,这样不可等式的B a将不被允许,也不是逐个方法的。

我认为这就做到了

{-# 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
但这一条被拒绝了,没有任何立场的例子


我想这就是诀窍

{-# 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
但这一条被拒绝了,没有任何立场的例子


您希望能够将类实例限制为类型本身为Eq实例吗?是,将B a类型实例限制为类型本身为Eq实例。您希望能够将类实例限制为类型本身为Eq实例吗?是,为了能够将B a类型的实例限制为本身就是Eq.Kudos实例的类型,现在看来很清楚我在类型族上迈出了第一步。Kudos,现在看来很清楚我在类型族上迈出了第一步。