什么是Scala中的apply方法,特别是用于类型定义

什么是Scala中的apply方法,特别是用于类型定义,scala,generics,apply,Scala,Generics,Apply,我知道applymethod在companion object中使用时是语法糖。 然而,当在类型定义中使用apply方法时,该方法的作用是什么 type Applyn = { def apply[A](f: A=>A, n: Int, x: A): A } 这句话之间有区别吗? 我猜,这句话是用来给Applyn赋值的 例如,通过使用上面的句子,我们可以 (Int=>Int, Int, Int)=>Int 等,仅转换为单个类型Applyn 这是正确的吗?您正在查看的

我知道
apply
method在companion object中使用时是语法糖。 然而,当在类型定义中使用
apply
方法时,该方法的作用是什么

type Applyn = {
    def apply[A](f: A=>A, n: Int, x: A): A
}
这句话之间有区别吗? 我猜,这句话是用来给Applyn赋值的

例如,通过使用上面的句子,我们可以

(Int=>Int, Int, Int)=>Int

等,仅转换为单个类型
Applyn


这是正确的吗?

您正在查看的是结构类型。它不是指任何特定类型,而是指任何具有方法
apply[a](f:a=>a,n:Int,x:a):a
的类型。函数有一个apply方法,所以具有正确签名的函数适用,但也可以创建具有apply方法的类型,而不是函数。想象一下下面的情景

object NotAFunction {
  def apply[A](f: A=>A, n: Int, x: A): A = {...}
}
此对象不扩展函数,因此它不是函数,但仍然满足结构类型要求


结构类型提供了一个很好的语法,但它们非常慢,因此应该尽可能避免使用它们,特别是在性能关键型代码中。

它被称为
结构类型
Applyn
只是指具有方法
def-apply[a](f:a=>a,n:Int,x:a):a
的任何类型,它不是指函数本身,而是指具有
def apply[a](f:a=>a,n:Int,x:a):a
object NotAFunction {
  def apply[A](f: A=>A, n: Int, x: A): A = {...}
}