1

我刚开始学习 Scala,来自 Java 背景。我一直在尝试理解函数中的类型参数和类型的推断。这是 Scala 文档中的标准示例:

class Decorator(left: String, right: String) {
  def layout[A](x: A) = left + x.toString() + right
}

object FunTest extends Application {
  def apply(f: Int => String, v: Int) = f(v)
  val decorator = new Decorator("[", "]")
  println(apply(decorator.layout, 7))
}

如果我尝试将类型参数应用于apply函数并保持v强类型,则会发生类型不匹配。为什么这里没有推断出类型?

def apply[B](f: B => String, v: String) = f(v) //Type mismatch
def apply[B](f: B => String, v: B) = f(v)      //Works fine

谢谢

4

1 回答 1

1

让我们看看apply没有它的身体:

 def apply[B](f: B => String, v: String)

上面写着“apply是一个在 type 上参数化的函数(方法)B,它接受一个函数 from BtoString和一个String”。

B其视为类型变量;它需要在某个时候实例化。那一点不是apply. 就是当 apply 应用于 ;-)

根据本合同,必须允许这样的使用:

 def g(i: Int): String = "i is " + i

 apply(g, "foo")  // Here the type variable `B` is "instantiated" to the type Int,

但是考虑到你有一个像 的身体f(v),只是替换,我们看到了矛盾:

代替

 f(v)

 g("foo") // can't compile; g takes a B, which is an Int
于 2013-11-03T17:48:06.280 回答