如何在scala中切片元组

khe*_*aud 23 scala

我正在尝试切片一个元组,删除最后两个项目.我尝试使用list drop/take方法,但我无法成功获得元组.

这是我尝试的方法:

scala> val myTuple = (1, 2, 4, 5, 0, 5)
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5)

scala> val myList = myTuple.productIterator.toList
myList: List[Any] = List(1, 2, 4, 5, 0, 5)

scala> val mySubList = myList.dropRight(2)
mySubList: List[Any] = List(1, 2, 4, 5)

scala> val mySubTuple = ???
Run Code Online (Sandbox Code Playgroud)

我在这里看到,在scala中,元组的列表不是(但是?).

是否有其他方法可以获得该子组(不处理myTuple._1,myTuple._2 ...)?

oxb*_*kes 40

这是无形的可以通用的方式做的事情,包括转换成HList.

首先 - 变得没型.然后运行scala并打开依赖方法类型(默认情况下在2.10中打开):

C:\Scala\sdk\scala-2.9.2\bin>scala -Ydependent-method-types
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04).
Type in expressions to have them evaluated.
Type :help for more information.
Run Code Online (Sandbox Code Playgroud)

在classpath中添加shapeless:

scala> :cp C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar
Added 'C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar'.  Your new classpath is:
"C:\tibco\tibrv\8.2\lib\tibrvnative.jar;C:\Users\cmarsha\Downloads\shapeless_2.9.2-1.2.2.jar"
Run Code Online (Sandbox Code Playgroud)

现在让我们玩吧!

scala> (1, 2.3, 'a, 'b', "c", true)
res0: (Int, Double, Symbol, Char, java.lang.String, Boolean) = (1,2.3,'a,b,c,true)
Run Code Online (Sandbox Code Playgroud)

我们必须进口无形

scala> import shapeless._; import Tuples._; import Nat._
import shapeless._
import Tuples._
import Nat._
Run Code Online (Sandbox Code Playgroud)

我们把我们的元组变成了一个 HList

scala> res0.hlisted
res2: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char,shapeless.::[java.lang.String,shapeless.::[Boolean,shapeless.HNil]]]]]] = 1 :: 2.3 :: 'a :: b :: c :: true :: HNil
Run Code Online (Sandbox Code Playgroud)

然后我们取第4个(注意这_4是一个类型参数,而不是方法参数)

scala> res2.take[_4]
res4: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char, shapeless.HNil]]]] = 1 :: 2.3 :: 'a :: b :: HNil
Run Code Online (Sandbox Code Playgroud)

现在转换回元组

scala> res4.tupled
res5: (Int, Double, Symbol, Char) = (1,2.3,'a,b)
Run Code Online (Sandbox Code Playgroud)

我们可以缩短这个:

val (a, b, c, d) = sixtuple.hlisted.take[_4].tupled 
//a, b, c and d would all have the correct inferred type
Run Code Online (Sandbox Code Playgroud)

这当然可以概括为-tuple 的第一个M元素N

  • 一定要包含`-Ydependent-method-types`,否则你将无法找到参数tupler的隐含值:shapeless.Tupler [take.Out]`(让我困惑一段时间试图找出答案这个) (4认同)

sen*_*nia 5

scala> val myTuple = (1, 2, 4, 5, 0, 5)
myTuple: (Int, Int, Int, Int, Int, Int) = (1,2,4,5,0,5)

scala> myTuple match {
     |   case (a, b, c, d, _, _) => (a, b, c, d)
     | }
res0: (Int, Int, Int, Int) = (1,2,4,5)
Run Code Online (Sandbox Code Playgroud)


nai*_*rbv 5

怎么样:

scala> val myTuple =(1,2,4,5,0,5)
myTuple:(整数,整数,整数,整数,整数,整数)=(1,2,4,5,0,5)

scala> val(左,右):Tuple2 [List [Int],List [Int]] = myTuple.productIterator.toList.splitAt(myTuple.productArity-2)
左:List [Int] =列表(1、2、4、5)
右:List [Int] = List(0,5)

scala> val mytuple2 =(右(0),右(1))
mytuple2:(Int,Int)=(0,5)