0

PartialFunction の関数定義は次のとおりです。

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

PartialFunction を使用すると、コレクションcaseで withを使用してフィルタリングできます。collectたとえば、コレクション内の値が偶数の場合に String に変換される整数のリストと PartialFunction isEven[Int, String] がある場合。そのため、定義に戻り値の型を持つ新しいコレクションが返さ+Bれます。

私の質問は、なぜcontravariant -Aですかcovariance +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 に答える