Haskell 为什么不拒绝涉及类型族的无条件不明确方法?

Haskell 为什么不拒绝涉及类型族的无条件不明确方法?,haskell,types,type-families,Haskell,Types,Type Families,我有以下声明: class NN a where type Vector a :: * vectorize :: Vector a -> WordVector compute :: a -> SomeResult 在NN的一个实例中,我有以下内容: instance NN Model where type Vector Model = Vec compute m = .... vectorize v ... compute使用vectorize但无法

我有以下声明:

class NN a where
  type Vector a :: *

  vectorize :: Vector a -> WordVector

  compute :: a -> SomeResult
NN
的一个实例中,我有以下内容:

instance NN Model where 
  type Vector Model = Vec

  compute m = ....  vectorize v ...
compute
使用
vectorize
但无法进行类型检查:GHC表示无法将
Vector a0
Vec
统一起来,变量
a0
不明确

我不知怎么地理解了为什么在只使用typeclass约束调用
vectorize
的一般情况下,类型检查会失败:由于type family
Vector
是打开的,因此,给定一个特定的
向量a
图像,无法推断它是哪个
a
。多亏了,我也能理解为什么它在同一实例中定义的方法调用的特定情况下无法进行类型检查:在
vectorize
的调用站点上,
Vector a->WordVector
a
compute
a
之间没有关系

我不明白的是,编译器为什么不拒绝
矢量化
的声明。在以下和参考文献中,我发现以下陈述:

每个方法都必须在不正确的地方提到类变量 在相关的同义词下。例如,此声明定义了 无条件不明确的方法op,并被拒绝:

  class C a where
     type S a
     op :: S a → Int

编辑:我在GHC 8.0中使用GHC 7.8.3,但被拒绝。我刚刚试过
D类a,其中类型G a;bar::G a->Int
并引发了一个歧义错误。同样的示例在GHC 8.0中编译,扩展名为
allowambigUstypes
。(7.8.3中是否启用了该功能,可能是通过其他扩展实现的?)