にそれを通過した後、あなたは次のようなことを行うことができます。機能暗黙のパラメータはありません、それ以上そのスカラ座では高階関数
def foo(implicit v: Int) = println(v);
def h(x: Int) = { implicit val i: Int = x; foo }
h(42)
> 42
h
コールはクロージャとしてfoo
参照を取得します。
パラメータとしてh
にfoo
を渡ししようとする奇妙ではないでしょう。
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 => Unit
がInt
パラメータが暗黙的としてマークされている機能と一致していないため、コンパイラは有効な実際のパラメータとして、それを破棄し、そのための試みのようにそれはありますそれを評価する。呼び出しを実行するために宣言された暗黙の値を見つけることができません。
その場合、暗黙的なパラメータを持つ関数の型を表現する方法は何ですか?