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 familyVector
是打开的,因此,给定一个特定的向量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中是否启用了该功能,可能是通过其他扩展实现的?)