Scala 更高级类型的视图边界

Scala 更高级类型的视图边界,scala,higher-kinded-types,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[_]] d

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

$ 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
                    ^
$scala-语言:高级种类
欢迎使用Scala版本2.10.0(Java热点(TM)64位服务器虚拟机,Java 1.6.043)。
键入要计算的表达式。
键入:有关详细信息的帮助。
scala>特征F[M[]]
定义性状F
scala>def foo[M[]](隐式M:M[]=>F[M])=42
foo:[M[]](隐式M:M[]=>F[M])Int

scala>def bar[M[\u]请注意,类型参数列表中的
M[\u]
与类型
M[\u]
(即
M[\u]
在隐式参数列表中的函数类型中扮演的角色)之间存在细微的区别。第一个是类型构造函数参数,第二个是存在类型(有关更多信息,请参见第4.4节和第3.2.10节)

例如,我们可以用
M[X]
替换类型构造函数参数
M[\u]
,而不改变其含义,但在后一种情况下,这将是一个语法错误(对于某些{type X}
,这是类似
M[X]的缩写)

在下面的示例中,差异可能更为明显(编译得很好):


scala>def bar[M[u],M_u]谢谢你的解释。不过,我觉得这有点不一致。
scala> def bar[M[_], M_ <: M[_] <% F[M]] = 42
bar: [M[_], M_ <: M[_]](implicit evidence$1: M_ => F[M])Int