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 に答える