Scala: PartialFunction的函数定义是模糊的



PartialFunction的函数定义如下:

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

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

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

trait PartialFunction[A, B]

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

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

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

允许上述函数类型的良好定义的子类型关系

相关内容

  • 没有找到相关文章

最新更新