関数の戻り値の型の反変性の性質をパラメーターとして明確にする外部共変コンテナーの関数

Nov 23 2020

オプションには

def getOrElse[B >: A](default: => B): B = this match {
        case None => default
        case Some(a) => a
    }
def orElse[B >: A](obj: => Option[B]): Option[B] = this match {
        case None => obj
        case _ => this
    }

どちらかで私たちは持っています:

def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B]

私は何が起こっているのか、そしてその理由を理解しています、かなり拡張された例はこれである可能性があります

OrElse({Option [B]})。map {....} BがA:> Bのようなものである場合、Some(a)の場合、Some(a).map(f:B => ??? )次にKaboom

一般的に言って、私は分散で大丈夫だと思います。共変性と反変性の単純な例がユースケースとして説明しているものではないため、私が見たり理解したりしなかったことをここで確認したいと思います。

パラメータとしての関数の戻り値の型は、外部コンテナの分散位置についてチェックされます。

通常、例は次のようになります

Container[+A] {
  def outerfunction[B](value: A): B
}

次に、Aの逆分散の位置について説明しますが、実行できません。理由について完全な説明をやり直すことはしません。私たち全員がそれを理解していると仮定しましょう。

通常説明されないのは:

Container[+A] {
      def outerfunction(f: ??? => A): A
    }

タイプAのパラメーターを取得するだけでなく、そのAを返す関数パラメーターも取得します。コンパイラーはそれもチェックします。コンテナの関数のパラメータとして、ここで止まるのか、それともAを生成できるものなのか。

回答

1 slouc Nov 23 2020 at 22:17

あなたの理解は完全に正しいです。正直なところ、質問が正確に何であるかはわかりませんが、次のような場合にコンパイラがチェックする場所はどこであるかを想定します。

trait Container[+A] {
  def outerfunction(f: String => A): A
}

そして答えは-それらすべてです。

したがって、コンパイラがtrait Container[+A]を検出するとContainer、のすべてのオカレンスについてその本体をチェックし、Aそれらが次の場所にあるかどうかを確認します。

  • パラメータ位置(これは反変要件をもたらします)
  • 戻り値の型の位置(共変要件)
  • 両方(不変要件)
  • どちらでもない(いわゆるファントム分散)。

の場合、のContainer[+A]すべてのオカレンスAが共変位置にある必要があります。つまり、に問題がありString => Aます。

それはそれと同じくらい簡単です。それが「内部機能」であるか「外部機能」であるかは関係ありません。