为什么函数定义中缺少一个类型?

时间:2017-10-03 04:34:11

标签: scala

为什么在seqop中使用A时,在方括号中没有A的聚合函数声明?

def aggregate[B](z: B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B

而不是

def aggregate[A,B](z: B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B

2 个答案:

答案 0 :(得分:2)

我想你在谈论Scala集合。 aggregate是特征GenTraversableOnce的方法,它已经由类型参数A参数化:

trait GenTraversableOnce[+A] {
    ...
    abstract def aggregate[B](z: ⇒ B)(seqop: (B, A) ⇒ B, combop: (B, B) ⇒ B): B
}

因此,您不需要声明另一个类型参数A,因为它已经定义了!此外,如果您声明一个新的类型参数A,它将会遮挡现有的A,这将导致您不想要的内容。

答案 1 :(得分:1)

如果你引用TraversableOnce#aggregate,那是因为ATraversableOnce特征的类型参数。

代码看起来像这样:

trait TraversableOnce[+A] extends Any with GenTraversableOnce[A] {

  def aggregate[B](z: =>B)(seqop: (B, A) => B, combop: (B, B) => B): B =
    foldLeft(z)(seqop)

  // ... and many other things ...

}

A参数由特征绑定,B参数由方法绑定。