如何在不丢失类型推断的情况下隐式扩展Function

时间:2013-03-30 20:36:32

标签: scala enrich-my-library

对于DSL,我需要隐式扩展函数值。例如:

trait PimpedFunction[-A, +B] extends Function1[A, B] {
  def foo = 42
}

object PimpedFunction {
  implicit def pimp[A, B](f: Function1[A, B]): PimpedFunction[A, B] = 
    new PimpedFunction[A, B] {
      def apply(a: A) = f(a)
    }
}

使用PimpedFunction的函数可以定义为:

def takes(f: PimpedFunction[String, Int]) = f.foo

问题在于调用takes的代码。以下按预期工作:

takes((_: String).size)

但如果我忽略了参数类型,则编译无法推断它:

takes(_.size)

我可以更改任何内容以帮助scalac推理吗?

OBS:真实用例与此相关:https://gist.github.com/xeno-by/4542402

1 个答案:

答案 0 :(得分:3)

如果您可以允许takes功能进行转换,则可以正常工作:

def takes(f: Function1[String, Int])(
  implicit f2pf: Function1[String,Int] => PimpedFunction[String,Int]
) = f2pf(f).foo

(您可以重载takes以获取PF或常规功能)。