如何用尾巴映射列表项[Scala]

How to map list items with their tail [Scala]

如何用它的剩余尾部迭代地映射列表中的每个项目?伪代码示例:

val list = List(1,2,3,4) 
list.foreach((head, tail) => println(s"head= $head, tail= $tail")) 
// head= 1, tail = List(2, 3, 4) 
// head= 2, tail = List(3, 4) 
// head= 3, tail = List(4) 
// head= 4, tail = List()

最简单的方法似乎是旧的 for 循环,它的优点是它为您插入了一个过滤步骤,因此您不会在 Nil 情况下崩溃遍历尾巴:

for (h :: t <- (1 to 4).toList.tails) println(s"head: $h tail: $t")

给出:

head: 1 tail: List(2, 3, 4)
head: 2 tail: List(3, 4)
head: 3 tail: List(4)
head: 4 tail: List()

如果您实际上不需要 println 副作用,for-yield 将只为您提供值。

def rec(l: List[Int]) : Unit = {
    l match {
        case head::tail => println(s"head= $head, tail= $tail")
            rec(tail)
        case _ =>
    }
}

scala> rec(l)
    head= 1, tail= List(2, 3, 4)
    head= 2, tail= List(3, 4)
    head= 3, tail= List(4)
    head= 4, tail= List()

一个(对我来说)更直接的答案。正如@LuisMiguelMejíaSuárez 所说,尾巴是你的朋友

(xs zip xs.tails.toList) map {case (h, t) => println("Head: " + h + " Tail: " + t)}

可惜的是.toList