gpt4 book ai didi

scala - 如何在scala中对元组进行切片

转载 作者:行者123 更新时间:2023-12-03 03:59:01 25 4
gpt4 key购买 nike

我正在尝试对元组进行切片,删除最后两项。我尝试使用列表 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 = ???

我看到了here列表到元组在 scala 中(还?)不可能。

是否还有其他方法来获取该子元组(无需处理 myTuple._1、myTuple._2...)?

最佳答案

这就是 shapeless 的那种事情可以以通用方式执行,涉及转换为HList

第一 - get shapeless 。然后在打开的依赖方法类型的情况下运行 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.

将 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"

现在让我们来玩吧!

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

我们必须导入无形的

scala> import shapeless._; import Tuples._; import Nat._
import shapeless._
import Tuples._
import Nat._

我们将元组转换为 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

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

scala> res2.take[_4]
res4: shapeless.::[Int,shapeless.::[Double,shapeless.::[Symbol,shapeless.::[Char, shapeless.HNil]]]] = 1 :: 2.3 :: 'a :: b :: HNil

现在转换回元组

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

我们可以缩短这个:

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

这当然可以推广到 N 元组的前 M 个元素

关于scala - 如何在scala中对元组进行切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11098208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com