Scala 什么';Tuple2的概念目的是什么?
将此作为后续行动 我是scala的新手,一直在工作。p9的给定解决方案为:Scala 什么';Tuple2的概念目的是什么?,scala,functional-programming,Scala,Functional Programming,将此作为后续行动 我是scala的新手,一直在工作。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 ::
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)
}
}
}
这家公司在这里做所有的工作。正如您可以从API文档(它是链接)中看到的那样,span返回一个Tuple2(实际上文档说它返回了一对-但这在赞成或Tuple2中被弃用)。我试图弄明白为什么你不能得到一些东西,比如列表或者类似的东西,但我无意中发现了上面的SO链接。据我所知,Tuple2的原因与提高性能有关,因为它不必处理Java将int之类的东西“装箱/拆箱”到整数之类的对象中。我的问题是
1) 这是准确的说法吗
2) span之类的东西返回Tuple2还有其他原因吗
谢谢
span
只返回两个值。一个元组2
可以正好包含两个值。列表可以包含任意多个值。因此Tuple2
比使用列表更合适。TupleN对象与“标准”列表相比至少有两个主要区别:
- (不太重要的是)元组的大小是事先知道的,这样就可以更好地(由程序员和编译器)解释元组的大小
- (更重要的是)元组保留其每个元素/插槽的类型信息
请注意,正如所提到的,类型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>(“1”,2,3l)
res0:(字符串,Int,Long)=(1,2,3)
scala>res0.getClass
问题1:课堂[u;是否有人担心如果返回类型是List,调用方将如何错误地实现span?@DavidDaedalus你是什么意思,调用方将实现span
?span
已经实现,调用方调用span。抱歉-“caller”可能是一个糟糕的词语选择。我想知道是否有一些技术优势不仅仅是使用列表。你的说法是,Tuple2“更合适”-以什么方式?这不像是我们在运送东西并决定是否将一双运动鞋放在鞋盒或冰箱盒中,对吗?@DavidDaedalus从某种意义上说,Tuple2可以准确地表示可能返回的值,这更适合通过span
,而列表可以表示所有其他类型的值,例如,一个空列表或一个包含三个元素的列表。因此,如果span
将返回一个列表,您可以编写类似bla.span(…)(3)
的内容,并在运行时得到一个越界错误,而编写bla.span(…).u3根本不编译。类似地,针对(x,y,z)
的模式匹配是错误的,而针对列表(x,y,z)
的模式匹配只会在运行时失败。w00t!这有很大帮助-t/y!!每个值的已知大小和已知类型。