我有以下scala代码片段:
def append(as: List[Int], bs: List[Int]): List[Int] = as match {
case Nil => bs
case x::xs => x::append(xs, bs)
}
我不了解x::
所在行中的x::append(xs, bs)
。我知道,当列表as
为空时,bs
将被撤销(当as
之前不为空时,将附加as
)。但是scala如何知道在上述行中应该用as
将bs
附加到x::(..,..)
答案 0 :(得分:2)
如果我们对append
进行一点糖解可能会有所帮助
def append(as: List[Int], bs: List[Int]): List[Int] =
as match {
case Nil => bs
case ::(x, xs) =>
val list = append(xs, bs)
list.::(x)
}
请注意::
如何出现两次,但是第一个出现在
case ::(x, xs)
实际上是一个case class,尽管其符号名称似乎很奇怪,并且其声明看起来有点像这样
case class :: (head: A, next: List[A])
另一方面,第二个::
list.::(x)
实际上是Adds an element at the beginning of this list
的{{3}},看起来像这样
def :: (elem: B): List[B]
请注意,x :: list
等效于list.::(x)
而不是x.::(list)
意味着::
是在 right 参数上调用的。