将此作为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!
答案 0 :(得分:7)
与“标准”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
正如你在这里看到的,3元组中的每个元素都有不同的类型,允许更好的模式匹配,更严格的类型保护等。
+ 异构列表在Scala中也是可能的,但到目前为止,它们不是标准库的一部分,并且可能更难理解,特别是对于新手。
答案 1 :(得分:3)
span
正好返回两个值。 Tuple2
可以包含两个值。列表可以包含任意多个值。因此Tuple2
比使用列表更合适。