在haskell的类型族中使用多态类型

在haskell的类型族中使用多态类型,haskell,Haskell,我正在学习类型家庭,但它太令人困惑了。当我在类定义之外定义多态类型时,它工作得很好 {-# LANGUAGE Rank2Types #-} type T = Num a => a 但当在类定义中定义多态类型时 {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE Rank2Types #-} data D = D class A a where type T a :: * instance A D where type T D = Nu

我正在学习类型家庭,但它太令人困惑了。当我在类定义之外定义多态类型时,它工作得很好

{-# LANGUAGE Rank2Types #-}
type T = Num a => a
但当在类定义中定义多态类型时

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE Rank2Types #-}

data D = D

class A a where
    type T a :: *
instance A D where
    type T D = Num a => a 
然后编译器显示错误:

Illegal polymorphic or qualified type: forall a. Num a => a
In the type instance declaration for 'T'
In the instance declaration for 'A D'

是否有一种方法可以在返回类型为多态的类中生成函数,如as 3(Num a=>a)?

您能添加一个示例来使用这种东西吗?我认为
Num a=>a
作为返回类型可能没有您预期的那么有用。类型同义词和关联类型族(以及非关联类型族)在许多情况下表现相同,但实际上是不同的。类型同义词本质上只是执行语法替换。类型检查器不知道您的类型同义词。类型族应用程序可能需要有关周围类型的信息才能解析,因此类型检查器必须处理这些类型。要修复此错误,请定义
newtype X=X(对于所有a.Num a=>a)
type Ed D=X