将其作为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(实际上该文档说它返回一个对-但不赞成使用Tuple2或Tuple2)。我试图弄清楚为什么您没有得到诸如列表列表之类的东西,或者偶然发现上面的SO链接。据我了解,Tuple2之所以与提高性能有关,是因为不必将Java像int这样的东西“装箱/拆箱”到Integers之类的对象中。我的问题是

1)这是准确的陈述吗?

2)还有其他原因导致span等返回Tuple2吗?

谢谢!

最佳答案

与“标准” 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


如您所见,三元组中的每个元素都有一个不同的类型,从而可以实现更好的模式匹配,更严格的类型保护等。

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

关于scala - Tuple2的概念目的是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28705028/

10-11 07:29