一个干净的方法将两个元组组合成一个新的scala中更大的元组?

jxs*_*ord 15 scala scalaz

假设我有以下元组:

scala> val t1 = Tuple2("abcd", "efg")
t1: (java.lang.String, java.lang.String) = (abcd,efg)

scala> val t2 = Tuple2(1234, "lmnop")
t2: (Int, java.lang.String) = (1234,lmnop)

scala> val t3 = Tuple3("qrs", "tuv", "wxyz")
t3: (java.lang.String, java.lang.String, java.lang.String) = (qrs,tuv,wxyz)
Run Code Online (Sandbox Code Playgroud)

是否有一种友好的方式将它们(必要时分两步)组合成一个Tuple7?我真的在寻找一个结合任意大小的元组的一般答案,并意识到由于最大元组大小的上限会有限制.我特意寻找一个元组结果,而不是一个集合.

huy*_*hjl 15

Shapeless需要依赖的方法类型(-Ydependent-method-types),我希望2.9.1有一个可下载的二进制文件,这样我就可以简单地尝试一下,但它看起来真的很优雅.基于此单元测试,它将适用于您的情况,如下所示:

import shapeless.Tuples._
import shapeless.HList._
val t7 = (t1.hlisted ::: t2.hlisted ::: t3.hlisted).tupled
Run Code Online (Sandbox Code Playgroud)

虽然Miles表示不能保证支持,但它实际上有单元测试,源代码在github上有开源许可证,所以至少它不仅仅是博客文章中的实验.

编辑:工作广告 - 花了一些时间编译,我不得不添加-Xss1m到sbt:

$ scala -Ydependent-method-types -cp target/scala-2.9.1/shapeless_2.9.1-1.1.0.jar
Welcome to Scala version 2.9.1.final (Java HotSpot(TM) Client VM, Java 1.7.0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> import shapeless.Tuples._
import shapeless.Tuples._

scala> import shapeless.HList._
import shapeless.HList._

scala> val t1 = Tuple2("abcd", "efg")
t1: (java.lang.String, java.lang.String) = (abcd,efg)

scala> val t2 = Tuple2(1234, "lmnop")
t2: (Int, java.lang.String) = (1234,lmnop)

scala> val t3 = Tuple3("qrs", "tuv", "wxyz")
t3: (java.lang.String, java.lang.String, java.lang.String) = (qrs,tuv,wxyz)

scala> (t1.hlisted ::: t2.hlisted ::: t3.hlisted).tupled
res0: (java.lang.String, java.lang.String, Int, java.lang.String, java.lang.String,
java.lang.String, java.lang.String) = (abcd,efg,1234,lmnop,qrs,tuv,wxyz)
Run Code Online (Sandbox Code Playgroud)


Lui*_*hys 6

你真的需要在这里使用集合,特别是如果所有元素都是相同的类型.你可以List毫不费力地将元组组合成一个:

def combine(xss: Product*) = xss.toList.flatten(_.productIterator)
Run Code Online (Sandbox Code Playgroud)

使用你的例子:

scala> combine(t1, t2, t3)
res1: List[Any] = List(abcd, efg, hijk, lmnop, qrs, tuv, wxyz)
Run Code Online (Sandbox Code Playgroud)

试图将其转换回元组是行不通的,因为你的转换方法(例如模式匹配)将无法返回特定的元组类型(方法的返回类型是什么?),以及类型信息每个元素都丢失了.

  • 我应该给出一个更好的例子.不能保证元组的所有成员都属于同一类型,我特意寻找获得新元组的方法.在其他情况下,我会使用一个集合,但在这种情况下,答案需要一个元组.我提炼了这个问题...... (3认同)