2015-09-22 13 views
8

にそれを通過した後、あなたは次のようなことを行うことができます。機能暗黙のパラメータはありません、それ以上そのスカラ座では高階関数

def foo(implicit v: Int) = println(v); 
def h(x: Int) = { implicit val i: Int = x; foo } 

h(42) 
> 42 

hコールはクロージャとしてfoo参照を取得します。

パラメータとしてhfooを渡ししようとする奇妙ではないでしょう。

def g(x: Int)(f: Int => Unit) = { implicit val i: Int = x; f } 

しかし、それは動作しないでしょう。私はそれが起こっていると思う何

g(1)(foo) 
> error: could not find implicit value for parameter v: Int 

fooが得るということです実際のパラメータの評価と呼ばれます。 そうですか?

通常のパラメータリスト(暗黙的ではない)で機能を渡されると、関数が評価されていない。

def foo2(v: Int) = println("Foo2") 
g(1)(foo2) 
> Int => Unit = <function1> 

これは予想される結果であり、foo2評価は、実際の評価として試されていませんパラメータ。

fooは暗黙の値がない場合に実際のパラメータとして評価されるのはなぜですか?

同じことが逢引で発生します。

val fooref: Int => Unit = foo 
> error: could not find implicit value for parameter v: Int 

Int => UnitIntパラメータが暗黙的としてマークされている機能と一致していないため、コンパイラは有効な実際のパラメータとして、それを破棄し、そのための試みのようにそれはありますそれを評価する。呼び出しを実行するために宣言された暗黙の値を見つけることができません。

その場合、暗黙的なパラメータを持つ関数の型を表現する方法は何ですか?

答えて

11

残念ながら、関数は暗黙のパラメータを持つことはできません。メソッドだけができます。式g(1)(foo)

fooは(また、ETA-拡張として知られている)関数方法から変換されました。また、Scala仕様のsection 6.26.2では、暗黙の引数がの前に適用され、のη拡張が行われます。

はこのチケットを参照してください:機能gからimplicit methods behave suboptimally when used non-implicitly

1

fパラメータのタイプはFunction1[Int, Unit]です。 Function1[A, B]は、単一の方法apply(a: A): Bを持つ形質であり、aは暗黙的ではありません。したがってfooからFunction1[Int, Unit]のインスタンスを作成することはできません。正しい署名はありません。