查看更高级别类型的边界

时间:2013-03-16 10:23:24

标签: scala higher-kinded-types

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

$ 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相同的东西吗?我错过了什么?

1 个答案:

答案 0 :(得分:6)

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

例如,我们可以在不更改含义的情况下将类型构造函数参数M[_]替换为M[X],但在后一种情况下这将是语法错误(这是{{{ 1}})。

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

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[_]上限)是一个存在类型。

Scala编译器可以想象M_正如你所期望的那样工作 - 也就是说,它可以将类型构造函数参数转换为它为上下文绑定创建的隐式参数类型中的存在类型 - 但这需要额外的一小部分编译器魔法,并且已经有足够的能够解决这个问题了。