2013-09-03 18 views
7

特定の暗黙のパラメータを受け入れる関数を引数とする高次関数を望みます。Scalaの暗黙的なパラメータを持つ関数のタイプ

より正確には、暗黙のコンテキストに依存するFuture作成メソッドを使用し、コンテキストに依存しないメソッドを返す関数を作成しようとしています。

、より具体的のは、私はこのような何かがあることを言うようにする:私はprovideCtx(foo)を呼び出す場合、

def provideCtx[A](func: ExecutionContext => A): A = { 
    val ctx = setupCtx 
    func(ctx) 
} 

しかし:私はこのようなメソッドを持っているしたいと思います

def foo(a: Int)(implicit ctx: ExecutionContext): Future[Float] = future { somelongBar... } 

をコンパイラは、暗黙的な実行コンテキストが不足していると不満を持ちます。

私がExecutionContextを扱っているという事実はあまり重要ではありません。私が見つけたいのは、特定の型の暗黙の引数を持つ関数を受け入れるためにパラメータ型を書く方法です。暗黙的な部分はカリー化された引数なので、実際には私のような関数があることを理解しています:ExecutionContext => Int => Future[Float]、実行時には、jvmはExecutionContextが暗黙的であることを知りませんが、コンパイラにそれを理解させる。

答えて

2

fooはメソッドであり、関数ではなく、メソッドから関数へ変換するη拡張は暗黙的なアプリケーションの後まで試みられません。詳細については、言語仕様のセクション6.26.2を参照し、その他の説明はthis issueを参照してください。以来、私たちができない、(少なくとも反射のいくつかの種類などなし)

provideCtx((ctx: ExecutionContext) => (a: Int) => foo(a)(ctx)) 

私はより一般的な解決策が可能であるかわからない:

回避策の一つは、このような何かを書くことになりますたとえスコープが暗黙的でなくてもfooを参照することもできます(もちろん、メソッド呼び出しを除く)。

+0

確かに、私は今、非常に似たようなものを書いてしまいました。ちょっと面倒です。 – Mortimer

関連する問題