编译器在 Scala 中生成函数 class

Compiler generated function class in Scala

我明白当我这样做时:

val sum = (a: Int, b: Int) => a + b

Scala 编译器把它变成这样:

val sum = new Function2[Int, Int, Int] {
 def apply(a: Int, b: Int): Int = a + b
}

因此 Function2 是一个 class 为基于 Int 的 operations.We 使用 [] 来传达此 class 中的操作仅涉及(输入,输出,主体)Int。 [] 中的一个 Int 条目是否足以传达这一点。但是我们在 [].

中有 3 个 Int 条目

Function2 中没有任何内容表明它是 "made for Int based operations"。

Function2[X, Y, Z] 是通用函数的 class,它采用 XY 以及 return 和 Z 类型的两个输入.

指定单个 Int 显然是不够的,因为 Function2 恰好需要 三个 类型参数。

否则你怎么能区分

Function2[Int, Int, Int]

还有一个

Function2[Int, Double, String]

例如

val sum = (a: Int, b: Double) => a + " -> " + b

这是

的语法糖
val sum = new Function2[Int, Double, String] {
  def apply(a: Int, b: Double) = a + " -> " + b
}

?


如果你经常使用Function2[T, T, T]相同的类型T,你可以定义一个类型别名:

type BinOp[T] = Function2[T, T, T]

或更短:

type BinOp[T] = (T, T) => T