我有以下声明:
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
不明确。
我以某种方式理解为什么在仅使用类型类约束调用vectorize
的一般情况下,类型检查会失败:因为类型族Vector
已打开,所以给定特定的Vector a
是没有办法的图像来推断它是a
。感谢this answer我也理解为什么在同一个实例中定义的方法中调用特定情况时无法进行类型检查:在vectorize
的调用站点之间a
之间没有任何关系。 1 {} Vector a -> WordVector
和a
compute
。
我不明白为什么编译器不会拒绝vectorize
的声明。在this page和参考文件之后,我在this paper中找到了以下声明:
每个方法都必须在某个地方提及类变量 在相关的同义词下。例如,此声明定义了一个 无条件模糊的方法操作,并被拒绝:
class C a where type S a op :: S a → Int
编辑:我正在使用GHC 7.8.3