Tuple2 的概念目的是什么?

what's the conceptual purpose of the Tuple2?

将此作为 this SO question

的跟进

我是 Scala 的新手,正在学习 99 problems。 p9 的给定解决方案是:

object P09 {
  def pack[A](ls: List[A]): List[List[A]] = {
    if (ls.isEmpty) List(List())
    else {
      val (packed, next) = ls span { _ == ls.head }
      if (next == Nil) List(packed)
      else packed :: pack(next)
    }
  }
}

span function 在这里完成所有工作。正如您从 API 文档(它是 link)中看到的那样,跨度 returns 是一个 Tuple2(实际上文档说它是 returns 一对 - 但它已被弃用,取而代之的是 or元组 2)。我试图弄清楚为什么你没有得到像列表列表之类的东西,并且偶然发现了上面的 SO link。据我了解,Tuple2 的原因与提高性能有关,因为不必处理 Java 的 'boxing/unboxing' 之类的东西,例如整数到整数之类的对象。我的问题是

1) 这个说法准确吗?

2) 是否有其他原因导致像 span 到 return 一个 Tuple2?

谢谢!

span returns 刚好是两个值。 Tuple2 可以恰好包含两个值。列表可以包含任意多个值。因此 Tuple2 比使用列表更合适。

TupleN 对象与 "standard" List+ 相比至少有两个主要差异:

  • (不太重要)元组的大小是事先已知的,允许更好地推理它(由程序员和编译器)。
  • (更重要的是)元组为其每个元素保留类型信息/"slots".

请注意,如前所述,类型 Tuple2TupleN 家族的一部分,它们都使用相同的概念。例如:

scala> ("1",2,3l)
res0: (String, Int, Long) = (1,2,3)

scala> res0.getClass
res1: Class[_ <: (String, Int, Long)] = class scala.Tuple3

正如你在这里看到的,三元组中的每个元素都有不同的类型,允许更好的模式匹配、更严格的类型保护等。

+异构列表在 Scala 中也是可能的,但是,到目前为止,它们不是标准库的一部分,而且可以说更难理解,尤其是对于新手。