Вопрос о выводе типа Scala

Я просто слонялся с превосходным осуществлением 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?

6
задан ephemient 14 December 2010 в 00:06
поделиться

1 ответ

Я попробовал это:


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.

7
ответ дан 17 December 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: