Как неявно расширить функцию без потери логического вывода
Для 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)
Могу ли я что-то изменить, чтобы помочь выводу Скалака?
OBS: Реальный вариант использования связан с этим: https://gist.github.com/xeno-by/4542402
1 ответ
Решение
Если вы можете позволить takes
Функция, чтобы сделать само преобразование, это будет работать:
def takes(f: Function1[String, Int])(
implicit f2pf: Function1[String,Int] => PimpedFunction[String,Int]
) = f2pf(f).foo
(вы можете перегрузить takes
взять или PF или обычную функцию).