Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中将两个元组合并成一个新的更大元组的干净方法?_Scala_Scalaz - Fatal编程技术网

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

在scala中将两个元组合并成一个新的更大元组的干净方法?,scala,scalaz,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.l

假设我有以下元组:

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(如果需要,可以分两步)?我真的在寻找一个关于组合任意大小的元组的一般答案,并且意识到由于最大元组大小的上限,会有一些限制。我特别寻找的是元组结果,而不是集合。

您确实需要在这里使用集合,尤其是在所有元素都是相同类型的情况下。您可以轻松地将元组组合到
列表中:

def combine(xss: Product*) = xss.toList.flatten(_.productIterator)
以您的例子:

scala> combine(t1, t2, t3)
res1: List[Any] = List(abcd, efg, hijk, lmnop, qrs, tuv, wxyz)
试图将其转换回元组是行不通的,因为您的转换方法(例如,使用模式匹配)将无法返回特定的元组类型(方法的返回类型是什么?),并且每个元素的类型信息都已丢失。

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

import shapeless.Tuples._
import shapeless.HList._
val t7 = (t1.hlisted ::: t2.hlisted ::: t3.hlisted).tupled
尽管Miles表示不保证支持,但它实际上有单元测试,并且源代码在github上,具有开放源代码许可证,所以至少它不只是在博客文章中进行的实验

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

$ 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)

我应该举个更好的例子。不能保证元组的所有成员都是相同类型的,我正在寻找一种获取新元组的方法。在其他情况下,我会使用集合,但在本例中,答案需要一个元组。我已经完善了这个问题……查看各种形式的HLists:在某个时候,我可能会将
HList
样式的操作直接拉到元组上,这样您就可以跳过hlisted/tupled shuffle,只需编写
t1::t2::t3
。我已经同意了,但在我承诺之前,我想确定额外的暗示不会造成大破坏。是的,这正是我想要的。感谢huynhjl指出这一点,并通过腿部工作证明它满足了问题,感谢Miles编写了如此酷的软件包!