sealed trait Sum[+A, +B] {
def flatMap[A, C](f: B => Sum[A, C]): Sum[A, C] =
this match {
case Failure(v) => Failure(v)
case Success(v) => f(v)
}
}
関数のパラメータは反例であり、結果は共変ですか?なぜコンパイラはAが反対の位置にいると言うのでしょうか?私は、コンパイラが、Bが逆変わりの位置にあると不平を言うことを期待しています。関数の差異
誰かが私にこの理由を説明することはできますか?混乱していると感じる。
sealed trait Sum[+A, +B] {
def flatMap[C](f: B => Sum[A, C]): Sum[A, C] = // No shadowing of A
this match {
case Failure(v) => Failure(v)
case Success(v) => f(v)
}
}
再びflatMap
を見てみましょう:
def flatMap[C](f: B => Sum[A, C]): Sum[A, C]
するのは、それを少し書き直してみましょう:
メソッド定義に 'A'型のパラメータがオーバーロードされているためですか? 'def flatMap [C](f:B => Sum [A、C]):Sum [A、C]'とするとエラーになります。 – adamwy
なぜ人々がこのコメントをアップヴォートするのか分かりません。過負荷を掛けなくても、「A」*は反差異的な位置にあります。大きな説明については、このプレゼンテーションを参照してください:https://youtu.be/VZWLRepyNvo?t=1h5m57s –
私は混乱のために謝罪します。元のコードスニペットはdef flatMap [AA>:A、C](f:B => Sum [AA、C])でした:Sum [AA、C] = ???私はコンパイルされていないバージョンを表示し、その場で編集したかったのです。 defMap [C](f:B => Sum [A、C])だったはずです:Sum [A、C] = ??? – laiboonh