Вопрос о типе Scala - PullRequest
       44

Вопрос о типе Scala

6 голосов
/ 25 мая 2010

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

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?

1 Ответ

7 голосов
/ 25 мая 2010

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


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.

...