我只是在陶醉 托尼·莫里斯(Tony Morris)的精彩练习, ,当我思考以下情况下发生的事情时...

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?

有帮助吗?

解决方案

我尝试了一下:


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)
  }
}

因此,从外观上看,Type推论器提出了选项#1。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top