是否可以使用类型类中未提及的变量的关联类型同义词?

时间:2011-11-13 19:17:52

标签: haskell types

Associated Type Synonyms (Chakravarty,Keller,Jones)中,该论文似乎表明以下内容是有效的:

class C a where
  type S a (k :: * -> *) :: *

然而,当我尝试运行它时,我得到编译器错误(使用-XTypeFamilies):

Not in scope: type variable `k'

我是否遗漏了任何内容,或者GHC中的实际实施与文章中提到的不一样?

2 个答案:

答案 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 :: * -> *) -> *

......如果你不需要额外的电力,它可以起到同样的作用。