将其作为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
对象至少具有两个主要区别:
(不太重要)元组的大小是事先已知的,从而可以更好地推理(程序员和编译器)。
(更重要的是)元组保留其每个元素/“槽”的类型信息。
请注意,正如所暗示的,类型Tuple2
是TupleN
家族的一部分,都使用相同的概念。例如:
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/