在做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)不编译说"无法解析引用+签名"。
答案 0 :(得分:3)
在sum3
中,签名中的所有Int
都是类型参数,而不是scala.Int
类型。也就是说,sum3
与
def sum4[A](l: List[A]): A = foldLeft(l, 0) (_ + _)
在sum2
中,类型参数毫无意义,因为它不能在任何地方使用。编译器可能几乎总是将其推断为Nothing
。