F [_]和F [T]之间的区别在Scala中用于类型构造函数时

dad*_*ade 8 types scala

这个问题是关于_在类型构造函数中使用的,而不是在用于定义存在类型时.

所以问题是当_用作类型参数而不是类似变量时有什么区别T.例如F[_]和之间的区别F[T].

我能想到的唯一的区别是与F[_]参数本身可以有许多小孔尽可能...这是F[_]可以成为F[Int]F[Future[Option[Int]]]等...而当你F[T]T只能是合适的类型......是F[String]F[Int]等.

这是正确的假设吗?并且是之间的主要区别F[_]F[T]?还是还有更多?

将两者用作类型参数的情况如何?例如,trait Functor [F[_]]和之间有什么区别trait Functor [F[T]]

如果将仿函数特征定义为trait Functor [F[_]]而不是trait Functor [F[T]]?那么是否存在语义差异?

Ale*_*nov 5

引用规范

上述范围限制被推广到嵌套类型参数子句的情况,它声明了高阶类型参数。高阶类型参数(类型参数的类型参数t)仅在其紧邻的参数子句(可能包括更深嵌套级别的子句)和 t 的边界中可见。因此,它们的名称只能与其他可见参数的名称成对不同。由于高阶类型参数的名称因此通常无关紧要,因此它们可能用 a 表示_,它在任何地方都不可见。

例子

以下是一些格式良好的类型参数子句:

[S, T]
[@specialized T, U]
[Ex <: Throwable]
[A <: Comparable[B], B <: A]
[A, B >: A, C >: A <: B]
[M[X], N[X]]
[M[_], N[_]] // equivalent to previous clause
[M[X <: Bound[X]], Bound[_]]
[M[+X] <: Iterable[X]]
Run Code Online (Sandbox Code Playgroud)

因此,如果您没有界限,例如Functor [F[T]],则与Functor [F[_]].