6

我只是在琢磨托尼莫里斯关于变质的出色练习,当时我正在思考在以下情况下发生了什么......

def cata[X](some: A => X, none: => X): X

现在让我按如下方式调用此方法:

def isDefined: Boolean = cata( _ => true, false)

我想知道类型推断器是否确定了的类型_ => trueA => BooleanAny => Boolean。由于其输入参数Function1逆变的,因此以下两个编译都很好:

def isDefined: Boolean = cata( (_: A) => true, false)    //#1
def isDefined: Boolean = cata( (_: Any) => true, false)  //#2

所以问题是,类型推断器提出#1 还是#2?

4

1 回答 1

7

我试过了:


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。

于 2010-05-25T09:55:31.157 回答