Вопрос

Я просто побуждался с Тони Моррис отличное упражнение по катаемфизмам, Когда я размышлял о том, что происходит в следующей ситуации ...

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top