我希望能够使用一个返回类型为R的函数来映射Scala元组(或三元组等)。结果应该是一个具有类型为R的元素的元组(或三元组等)。
如果元组的元素是相同类型的,则映射不是问题:
scala> implicit def t2mapper[A](t: (A,A)) = new { def map[R](f: A => R) = (f(t._1),f(t._2)) }
t2mapper: [A](t: (A, A))java.lang.Object{def map[R](f: (A) => R): (R, R)}
scala> (1,2) map (_ + 1)
res0: (Int, Int) = (2,3)
但是,是否也有可能使此解决方案通用化,即以相同方式映射包含不同类型元素的元组?
示例:
class Super(i: Int)
object Sub1 extends Super(1)
object Sub2 extends Super(2)
(Sub1, Sub2) map (_.i)
应该返回
(1,2): (Int, Int)
但是我找不到解决方案,让映射函数确定Sub1和Sub2的超类。我尝试使用类型边界,但我的想法失败了:
scala> implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }
<console>:8: error: X is already defined as type X
implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }
^
<console>:8: error: type mismatch;
found : A
required: X
Note: implicit method t2mapper is not applicable here because it comes after the application point and it lacks an explicit result type
implicit def t2mapper[A,B](t: (A,B)) = new { def map[X >: A, X >: B, R](f: X => R) = (f(t._1),f(t._2)) }
这里的
X >: B
似乎覆盖了X >: A
。是否意味着Scala不支持涉及多种类型的类型边界?如果是,为什么?