在 Associated Type Synonyms (Chakravarty,Keller,Jones)中,该论文似乎表明以下内容是有效的:
class C a where
type S a (k :: * -> *) :: *
然而,当我尝试运行它时,我得到编译器错误(使用-XTypeFamilies
):
Not in scope: type variable `k'
我是否遗漏了任何内容,或者GHC中的实际实施与文章中提到的不一样?
答案 0 :(得分:4)
正如您已经发现的那样,this is not possible in GHC:
正如关联数据声明的情况一样,命名类型参数必须是类参数子集的排列。实例
class C a b c where { type T c a :: * } -- OK class D a where { type T a x :: * } -- No: x is not a class parameter class D a where { type T a :: * -> * } -- OK
您提到的故障单实际上解释了无法定义S
之类的内容的原因。如果您这样做,它可以工作:
class C a where
type S a :: (* -> *) -> *
data TupK a k = TupK (a, k a)
instance C [a] where
type S [a] = TupK a
但是,现在你仍然坚持使用新的数据类型。使用类型同义词将不起作用(“类型同义词`TupK'应该有2个参数”),向S
添加更多参数将无济于事(“参数数量必须与系列声明匹配;预期为1”),如票证中所记录。
答案 1 :(得分:1)
不,但你可以做不那么强大的事情:
class C a where
type S a :: (k :: * -> *) -> *
......如果你不需要额外的电力,它可以起到同样的作用。