问题描述
假设我有以下元组:
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)
是否有一种友好的方式将它们(如有必要,分两步)组合成一个 Tuple7?我真的在寻找组合任意大小的元组的一般答案,并意识到由于有上限的最大元组大小而存在限制.我特别在寻找元组结果,而不是集合.
Is there a friendly way to combine them (in two steps if necessary) into a Tuple7? I'm really looking for a general answer for combining tuples of arbitrary size, and realize that there will be limitations due to the capped maximum tuple size. I am specifically looking for a tuple result, not a collection.
推荐答案
Shapeless 需要依赖方法类型(-Ydependent-method-types
) 并且我希望 2.9.1 有一个可下载的二进制文件,这样我就可以简单地尝试一下,但它看起来确实很优雅.基于这个单元测试像这样适用于您的案例:
Shapeless requires dependent method types (-Ydependent-method-types
) and I wish there was a downloadable binary for 2.9.1 so that I can simply try it out but it's really seems elegant. Based on this unit test it would apply to your case like this:
import shapeless.Tuples._
import shapeless.HList._
val t7 = (t1.hlisted ::: t2.hlisted ::: t3.hlisted).tupled
尽管 Miles 表示不能保证支持,但它实际上有单元测试,并且源代码在 github 上并具有开源许可证,因此至少它不仅仅是博客文章中的实验.
Although Miles indicates there is not guarantee of support, it actually has unit tests and the source is on github with an open source license so at least it's not just an experiment in a blog post.
按广告方式工作 - 编译花了一些时间,我不得不将 -Xss1m
添加到 sbt:
works as advertized - took some time to compile and I had to add -Xss1m
to 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)
这篇关于在Scala中将两个元组组合成一个新的更大的元组的干净方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!