如何在元组之间应用隐式转换?

时间:2014-05-28 12:05:18

标签: scala types type-conversion tuples

我正在尝试使用currying / tupled作为将参数传递给函数的替代方法。在这次旅程中,我面临着一些类型的困难。

我想使用隐式转换将参数元组转换为目标类型。这就是我的期望:

给定(REPL示例):

case class Cont(value:String) // a simplified container class
val paramTuple = (Cont("One"),Cont("2"))
def operate(s:String, i:Int): String = s+i // my target operation
implicit def contToString(c:Cont): String = c.value
implicit def contToInt(c:Cont): Int = c.value.toInt

//这很有效 - 显然是

operate(paramTuple._1, paramTuple._2)
>res4: String = One2

//这就是我想要的,但不起作用

(operate _).tupled(params)
<console>:14: error: type mismatch;
 found   : (Cont, Cont)
 required: (String, Int)

Q1:为什么元组转换不起作用? (我期待对此的回答如下:所需要的是Tuple2 [Cont,Cont]与Tuple2 [String,Int]之间的隐式转换,但不能扩展)

Q2:我有什么选择让这种转换工作? 请记住,我想要一个N元组的解决方案,因此在这种情况下,将特定的Tuple2定义为Tuple2并不是一个好的解决方案。 AFAIK,磁铁模式的工作方式类似,所以我希望有一种方法。

1 个答案:

答案 0 :(得分:4)

  

Q1:为什么元组转换不起作用? (我希望对此的答案符合以下要求:所需要的是Tuple2 [Cont,Cont]与Tuple2 [String,Int]之间的隐式转换,但不能扩展)< / p>

是的,你做对了。

  

我有什么选择让这种转换有效?

你可以这样做:

implicit def liftImplicitTuple2[A, B, A1, B1](tuple: (A, B))
  (implicit f1: A => A1, f2: B => B1): (A1, B1) =
  (f1(tuple._1), f2(tuple._2))

implicit def liftImplicitTuple3[A, B, C, A1, B1, C1](tuple: (A, B, C))
  (implicit f1: A => A1, f2: B => B1, f3: C => C1): (A1, B1, C1) =
  (f1(tuple._1), f2(tuple._2), f3(tuple._3))

// etc for tuples as large as you need