Tuple2的概念目的是什么?

时间:2015-02-24 19:53:48

标签: scala functional-programming

将此作为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文档(它的链接)中看到的那样,span返回一个Tuple2(实际上,doc说它返回了一对 - 但是它已经被赞成使用或者是Tuple2)。我试图弄清楚为什么你不会像列表列表或某些类似的东西那样得到回报,并偶然发现上面的SO链接。据我了解,Tuple2的原因在于不必处理Java的拳击/拆箱问题而提高性能。像整数这样的对象。我的问题是

1)是一个准确的陈述?

2)还有其他原因可以让span返回Tuple2吗?

THX!

2 个答案:

答案 0 :(得分:7)

与“标准”TupleN +相比,List对象至少有两个主要差异:

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

请注意,正如所提到的,类型Tuple2TupleN系列的一部分,都使用相同的概念。例如:

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

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

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

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

答案 1 :(得分:3)

span正好返回两个值。 Tuple2可以包含两个值。列表可以包含任意多个值。因此Tuple2比使用列表更合适。