我想做这样的事情(非常简化):
((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 定义了
Tuple2
和 Tuple3
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/