Время вывода Scala Type
-
04-10-2019 - |
Вопрос
Я просто побуждался с Тони Моррис отличное упражнение по катаемфизмам, Когда я размышлял о том, что происходит в следующей ситуации ...
def cata[X](some: A => X, none: => X): X
Позвольте мне сейчас позвонить этот метод следующим образом:
def isDefined: Boolean = cata( _ => true, false)
Мне было интересно, определяет ли Type Inferencer тип _ => true
быть A => Boolean
или Any => Boolean
. Отказ Благодаря тому факту, что Function1
является Contra-Variant. В своем входном параметре оба следующего компиляции просто тонны:
def isDefined: Boolean = cata( (_: A) => true, false) //#1
def isDefined: Boolean = cata( (_: Any) => true, false) //#2
Таким образом, вопрос в том, делает ли тип Type 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.
Не связан с StackOverflow