Scala函数语法类型声明

时间:2018-02-04 11:05:14

标签: scala

在做Scala练习的时候,我错误地遇到了这个编译问题,让我很好奇。

这是我的FoldLeft实施:

@annotation.tailrec
def foldLeft[A, B](l: List[A], b: B)(f:(B, A) => B): B = l match {
  case Nil => b
  case Cons(head, tail) => foldLeft(tail, f(b, head)) (f)
}

使用此FoldLeft我正在创建sum函数。

def sum1(l: List[Int]): Int = foldLeft(l, 0) (_ + _)
def sum2[A](l: List[Int]): Int = foldLeft(l, 0) (_ + _)
def sum3[Int](l: List[Int]): Int = foldLeft(l, 0) (_ + _)

sum1和sum2编译并运行正常,但sum3看起来类似于sum2(使用Int而不是A)不编译说"无法解析引用+签名"。

1 个答案:

答案 0 :(得分:3)

sum3中,签名中的所有Int都是类型参数,而不是scala.Int类型。也就是说,sum3

相同
def sum4[A](l: List[A]): A = foldLeft(l, 0) (_ + _)

sum2中,类型参数毫无意义,因为它不能在任何地方使用。编译器可能几乎总是将其推断为Nothing