Я просто слонялся с превосходным осуществлением Tony Morris на catamorphisms, когда я обдумывал то, что происходило в следующей ситуации...
def cata[X](some: A => X, none: => X): X
Позвольте мне теперь назвать этот метод следующим образом:
def isDefined: Boolean = cata( _ => true, false)
Я задавался вопросом, определяет ли тип inferencer тип _ => true
быть A => Boolean
или Any => Boolean
. Вследствие того, что Function1
контравариант в его входном параметре, обеих из следующей компиляции очень хорошо:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
Таким образом, вопрос, делает тип inferencer, придумывает № 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.