0

对于 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

4

1 回答 1

3

如果您可以允许您的takes函数自己进行转换,它将起作用:

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

(您可以重载takes以获取 PF 或常规函数)。

于 2013-03-30T21:12:07.123 回答