在Scala中迈出第一步,我遇到了第一个误解 我拿了一个链表的经典例子。
sealed trait List[+A] // `List` data type, parameterized on a type, `A`
case object Nil extends List[Nothing] // A `List` data constructor representing the empty list
/* Another data constructor, representing nonempty lists. Note that `tail` is another `List[A]`,
which may be `Nil` or another `Cons`.
*/
case class Cons[+A](head: A, tail: List[A]) extends List[A]
object List { // `List` companion object. Contains functions for creating and working with lists.
def sum(ints: List[Int]): Int = ints match { // A function that uses pattern matching to add up a list of integers
case Nil => 0 // The sum of the empty list is 0.
case Cons(x,xs) => x + sum(xs) // The sum of a list starting with `x` is `x` plus the sum of the rest of the list.
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] = // Variadic function syntax
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}
}
有几个问题:
1)为什么自定义链接List类与内置scala.collection.immutable.List.type
2)当我们将内置List与自定义链表匹配时,为什么一段代码应该是正确的?
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}
答案 0 :(得分:1)
自定义链接列表类与内置scala.collection.immutable.List.type
不冲突,因为本地声明(例如自定义列表类型)的优先级高于导入(甚至非显式类型)作为Scala的内置List
)。有关完整优先顺序,请参阅Scala Specification的第2章。
引用的匹配代码与内置List不匹配,但与您自己的本地声明的List匹配。您可以自己查看,方法是将List重命名为CustomList,并查看是否会出现一些错误,或者将内置List完全限定为以下代码。
以下代码实际上将内置List与您的自定义List结构匹配,并且不会编译:
val x = scala.collection.immutable.List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}
答案 1 :(得分:1)
我相信你的问题实际上是关于范围。您已经定义了自己的 List ,它与scala.collection.immutable中的 List 无关......与Cons和Nil相同。
在第2部分中实例化List时,您将实例化List,而不是Scala库中的List。
或者我错过了什么?