Как неявно расширить функцию без потери логического вывода

Для 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 или обычную функцию).

Другие вопросы по тегам