scala - 在 Scala 中使用元组

标签 scala tuples

我想做这样的事情(非常简化):

((1, 2, 3, 4, 5, 6), (6, 5, 4, 3, 2, 1)).zipped map (_ + _)

忽略整数的实际值(尽管这些是 6 元组很重要,实际上 :))。本质上,我想在维护 Map[String, (Int, Int, Int, Int, Int, Int)] 的函数中相当经常地使用它。更新现有元素时。

事实上,Scala 对我吐槽:
<console>:6: error: could not find implicit value for parameter w1: ((Int, Int, Int, Int, Int, Int)) => scala.collection.TraversableLike[El1,Repr1]
   ((1, 2, 3, 4, 5, 6), (6, 5, 4, 3, 2, 1)).zipped

如果我使用 Seq s 而不是元组,一切正常,但我想在类型系统中强制使用 6 元数(我可能很快会使用 type Record = (Int, Int, Int, Int, Int, Int) 作为快速重构)。

任何人都可以就我做错了什么/为什么 Scala 不处理上面的代码提供一些建议吗?我认为如果我使用 2 或 3 元元组,它可能会起作用,因为 Scala 定义了 Tuple2Tuple3 s(我知道跨任意 n 元缩放元组函数很困难),但我得到了同样的错误。

在此先感谢您提供的任何帮助:)。

最佳答案

您只想映射具有相同类型的元组——否则映射将没有意义——但元组在其类型签名中不包含它。但是,如果您愿意做一些工作,则可以进行设置,以便元组按照您要求的方式工作:

基础:

class TupTup6[A,B](a: (A,A,A,A,A,A), b: (B,B,B,B,B,B)) {
  def op[C](f:(A,B)=>C) = ( f(a._1,b._1), f(a._2,b._2), f(a._3,b._3), 
                            f(a._4,b._4), f(a._5,b._5), f(a._6,b._6) )
}
implicit def enable_tuptup6[A,B](ab: ((A,A,A,A,A,A),(B,B,B,B,B,B))) = {
  new TupTup6(ab._1,ab._2)
}

用法:
scala> ((1,2,3,4,5,6) , (6,5,4,3,2,1)) op { _ + _ }
res0: (Int, Int, Int, Int, Int, Int) = (7,7,7,7,7,7)

关于scala - 在 Scala 中使用元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3919738/

相关文章:

scala - 使用默认值填充可变映射或替代可变映射以实现 Scala 函数内存

scala - 导入语句 :error:not found in Scala REPL

f# - 使用类型别名来指示参数语义是标准做法吗?

c++ - 带有成员初始化的元组初始化

scala - 未能在 build.sbt 中包含 com.typesafe(对于 Scala 和 Heroku 上的 Spray)

Scala 排序选项

scala - 幺半群同态和同构

python - 执行元组算术的优雅方式

arrays - 使用嵌套元组对数组进行排序

python - 改变列表中的元组——这是最好的方法吗?