为什么涉及类型族的无条件模糊方法不被拒绝?

时间:2016-06-10 09:07:18

标签: 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,但未能进行类型检查:GHC表示无法将Vector a0Vec统一,变量a0不明确。

我以某种方式理解为什么在仅使用类型类约束调用vectorize的一般情况下,类型检查会失败:因为类型族Vector已打开,所以给定特定的Vector a是没有办法的图像来推断它是a。感谢this answer我也理解为什么在同一个实例中定义的方法中调用特定情况时无法进行类型检查:在vectorize的调用站点之间a之间没有任何关系。 1 {} Vector a -> WordVectora compute

我不明白为什么编译器不会拒绝vectorize的声明。在this page和参考文件之后,我在this paper中找到了以下声明:

  

每个方法都必须在某个地方提及类变量   在相关的同义词下。例如,此声明定义了一个   无条件模糊的方法操作,并被拒绝:

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

编辑:我正在使用GHC 7.8.3

0 个答案:

没有答案