我想弄清楚为什么下面的Scala代码编译?斯卡拉函数接受不同类型
trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
def map[A, B](as: List[A])(f: A => B): List[B] = as match {
case Nil => Nil
case Cons(x, xs) => Cons(f(x), map(xs)(f))
}
def tester[A, B](as: List[A])(f1: A => List[B]) = map(as)(f1)
按我的理解,tester
不应该编译,因为map
定义说,它接受两个参数:一个名单列表A => B
类型的函数。
然而,在tester
功能我有功能f1
这是A => List[B]
类型,因此,作为参数不匹配的类型,我认为编译器应该抛出错误。但代码编译正常。
你能帮我理解为什么代码在这里编译?
'.map'应该声明的类型参数'A',否则此人会影在该性状的水平类型参数'A'(并且在这种情况下无用反正) – cchantep
@cchantep'map'是特质之外。 – HTNW