这是我的用例:
def mkWrapper[A,B](doer: StuffDoer[B])(implicit ev: A => B) =
new StuffDoer[A] {
override def doStuff(a: A) = doer.doStuff(ev(a))
}
现在,假设我有一个
的实例 StuffDoer[AwfullyLong[Complicated,And],_ <: Difficult[ToRead],Type]
在某处定义,以及从String
到......井, 类型的隐式转换。
我正在寻找有关如何调用mkWrapper[String,_](doer)
的建议,并让它从doer
的类型推断其第二个类型参数,而不是将其拼写出来。
想法?
答案 0 :(得分:2)
此问题的一般解决方案是使用
创建一个新类apply
方法。 cats(Coproduct.left[X]
)和shapeless(*Aux
语法助手类)中的一些示例。
在您的情况下,这可能看起来像:
class WrapperHelper[A] {
def apply[B](doer: StuffDoer[B])(implicit ev: A => B) =
new StuffDoer[A] {
override def doStuff(a: A) = doer.doStuff(ev(a))
}
}
def mkWrapper[A] = new WrapperHelper[A]
当实际有两个函数调用时,你最终得到了一些函数调用:
val stuff: StuffDoer[Int] = ???
mkWrapper[Double](stuff)
mkWrapper[Double].apply(stuff)
这就像Rob Norris在他的评论中链接到@ m-z页面上所解释的那样。