【发布时间】:2017-09-10 00:51:09
【问题描述】:
我想弄清楚为什么下面的 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
map在特征之外。
标签: scala