5

我正在尝试设置一个绑定到高类型类型的视图,但我收到一条我无法理解的错误消息。

$ scala -language:higherKinds
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43).
Type in expressions to have them evaluated.
Type :help for more information.

scala> trait F[M[_]]
defined trait F

scala> def foo[M[_]](implicit m: M[_] => F[M]) = 42
foo: [M[_]](implicit m: M[_] => F[M])Int

scala> def bar[M[_] <% F[M]] = 42
<console>:8: error: type M takes type parameters
       def bar[M[_] <% F[M]] = 42
                    ^

不应该bar编译成与foo? 我错过了什么?

4

1 回答 1

6

请注意,M[_]类型参数列表中的 和类型M[_](即M[_]隐式参数列表中函数类型中的角色)之间存在细微差别。第一个是类型构造函数参数,第二个是存在类型(有关更多信息,请参阅Scala 语言规范的 4.4 和 3.2.10 节)。

因此,例如,我们可以在不改变含义的情况下将类型构造函数参数M[_]替换为M[X]M[X] forSome { type X }

以下示例中的差异可能更清楚(编译得很好):

scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int

这里第一个M[_]是类型构造函数参数,第二个(上界M_)是存在类型。

Scala 编译器可以M[_] <% F[M]按照您的期望在这里工作——即,它可以将类型构造函数参数转换为它为上下文绑定创建的隐式参数类型中的存在类型——但这需要额外的一小部分编译器的魔法,而且已经足够了。

于 2013-03-17T13:43:52.150 回答