0

次の簡単な例を考えてみましょう。

trait Optimizer[+FParam, FRes] {
  def optimize(
    fn: (FParam) => FRes,
    guesses: Seq[FParam] // <--- error
  )
}

コンパイルされません。

共変型は、値推測のFParam型の反変位置で発生します。Seq[FParam]

しかし seq は と定義されてtrait Seq[+A]いるので、この反変性の原因は何でしょう? (質問1 )

逆に、次の単純な例を考えてみましょう-FParam:

trait Optimizer[-FParam, FRes] {
  def optimize(
    fn: (FParam) => FRes, // <--- error
    guesses: Seq[FParam]
  )
}

反変型は、型の共変位置で発生します(FParam) => FRes

繰り返しますが、同じパラドックスです:Function1[-T1, R]では、最初の型パラメーターは明らかに反変であるのに、なぜFParam共変の位置にあるのでしょうか? (2 )

Lower type boundsで説明されているように分散を反転することでこの問題を修正できますが、なぜそれが必要なのかは不明です。

trait Optimizer[+FParam, FRes] {
  type U <: FParam

  def optimize(
    fn: (FParam) => FRes,
    guesses: Seq[U]
  )
}
4

3 に答える 3

0

問題は、FParam が直接使用されていないことです。それは の引数にありoptimize、その分散は反転されます。説明のために、次のタイプを見てみましょうoptimize(「 」を参照val optim)。

trait Optimizer[+FParam, FRes] {
  type U <: FParam

  def optimize(
    fn: (FParam) => FRes,
    guesses: Seq[U]
  )

  val optim: Function2[
    Function1[
      FParam,
      FRes
    ],
    Seq[U],
    Unit
  ] = optimize
}
于 2017-08-08T14:37:13.627 に答える