scala:追加两个列表

时间:2019-09-17 11:01:01

标签: scala list

我有以下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如何知道在上述行中应该用asbs附加到x::(..,..)

1 个答案:

答案 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 参数上调用的。