对于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
答案 0 :(得分:3)
如果您可以允许takes
功能进行转换,则可以正常工作:
def takes(f: Function1[String, Int])(
implicit f2pf: Function1[String,Int] => PimpedFunction[String,Int]
) = f2pf(f).foo
(您可以重载takes
以获取PF或常规功能)。