質問

私はただ陶芸していました トニー・モリスのカタモルフィスに関する優れた運動, 、私が次の状況で何が起こっていたかを熟考していたとき...

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

次のようにこの方法を呼び出しさせてください:

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

タイプの推測者がタイプのタイプを決定するかどうか疑問に思っていました _ => trueすることが A => Boolean また Any => Boolean. 。事実によるもの Function1コントラバリアント 入力パラメーターでは、次の両方のコンパイルの両方が正常に正常になります。

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

問題は、タイプの推測者は#1または#2を思いつくのですか?

役に立ちましたか?

解決

私はこれを試しました:


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を思いつきました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top