推断一个类型参数,但不推断另一个?

时间:2016-05-17 18:54:24

标签: scala generics

这是我的用例:

 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的类型推断其第二个类型参数,而不是将其拼写出来。

想法?

1 个答案:

答案 0 :(得分:2)

此问题的一般解决方案是使用

创建一个新类
  • 您要指定的类型参数和
  • 包含其余类型参数的apply方法。

catsCoproduct.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页面上所解释的那样。