0

PartialFunction 的函数定义如下:

trait PartialFunction[-A, +B] extends (A) ⇒ B

PartialFunction 将允许我们使用casewith collecton collection 进行过滤。例如,当您有整数列表和 PartialFunction isEven[Int, String] 时,如果集合中的值为偶数,它将转换为 String。因此它返回一个新集合,其返回类型+B在定义中。

我的问题是,为什么contravariant -Acovariance +B?它基本上有能力接受任何输入到任何输出。为什么我们需要指出输入应该是A类型的任何类型或超类型,而返回类型应该是B或其子类?我们不能说:

trait PartialFunction[A, B]
4

1 回答 1

4

不,它“基本上不允许它接受任何输出的任何输入”。协变和逆变不是微不足道的(在数学意义上)关系,它们由绑定类型严格定义 - 正如您可能意识到的那样。

这种特定形式的类型界限,即参数的逆变和返回类型的协变是一种普遍现象,不仅限于 Scala,它来自形式类型理论中的函数类型概念,具体而言:

如果 T1 → T2 是函数类型,则它的子类型是具有 T1 <: S1 和 S2 <: T2 属性的任何函数 S1 → S2。

允许所述函数类型的明确定义的子类型关系。

于 2014-06-12T14:13:48.907 回答