我正在尝试使用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,磁铁模式的工作方式类似,所以我希望有一种方法。
答案 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