6

次の状況で何が起こっているのかを考えていたとき、私はちょうどトニー・モリスの変容に関する優れた演習をポタリングしていました...

def cata[X](some: A => X, none: => X): X

このメソッドを次のように呼び出してみましょう。

def isDefined: Boolean = cata( _ => true, false)

型推論器が の型を or に決定するかどうか疑問に思ってい_ => trueましA => BooleanAny => BooleanFunction1入力パラメーターが反変であるため、次の両方が問題なくコンパイルされます。

def isDefined: Boolean = cata( (_: A) => true, false)    //#1
def isDefined: Boolean = cata( (_: Any) => true, false)  //#2

問題は、型推論器が 1 番と 2 番のどちらを思いつくかということです。

4

1 に答える 1

7

私はこれを試しました:


trait MyOption[+A] {
   def cata[X](some: A => X, none: => X): X
   def isDefined: Boolean = cata( _ => true, false)
}

これを でコンパイルしましたscalac -Xprint:types。これにより、次の出力が得られました。


[[syntax trees at end of typer]]// Scala source: myoption.scala
package  {
  abstract trait MyOption[A >: Nothing : Nothing  X, none: => X): X;
    def isDefined: Boolean = MyOption.this.cata[Boolean](((x$1: A) => true), false)
  }
}

見たところ、型推論器はオプション #1 を思いつきました。

于 2010-05-25T09:55:31.157 に答える