Scala:PartialFunction的函数定义不明确

时间:2014-06-12 13:59:21

标签: scala partialfunction

PartialFunction的功能定义如下:

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

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

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

trait PartialFunction[A, B]

1 个答案:

答案 0 :(得分:4)

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

这种特定形式的类型界限,即参数的逆变和返回类型的协方差是一般现象,不仅限于Scala,来自function types from formal type theory的概念,具体来说:

  

如果T1→T2是函数类型,那么它的子类型是任何函数S1→S2,其属性为T1 <:S1和S2 <:T2。

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