在下面的 Scala 方法中,List 是如何被xs
方法遍历的nth
?xs.tail
被递归调用,但为什么尾部并不总是相同的值,因为def tail
在 trait 中List
只返回参数化类型的列表?
object nth {
def nth[T](n: Int, xs: List[T]): T =
if (xs.isEmpty) throw new IndexOutOfBoundsException
else if (n == 0) xs.head
else {
nth(n - 1, xs.tail)
} //> nth: [T](n: Int, xs: week4.List[T])T
val list = new Cons(1, new Cons(2, new Cons(3, new Nil)))
nth(2 , list) > res0: Int=3
}
trait List[T] {
def isEmpty: Boolean
def head: T
def tail: List[T]
}
class Cons[T](val head: T, val tail: List[T]) extends List[T]{
def isEmpty = false
}
class Nil[T] extends List[T]{
def isEmpty = true
def head : Nothing = throw new NoSuchElementException("Nil.head")
def tail : Nothing = throw new NoSuchElementException("Nil.tail")
}