在Scala中,您可以执行以下操作:
def foo(implicit v: Int) = println(v);
def h(x: Int) = { implicit val i: Int = x; foo }
h(42)
> 42
h
调用得到 foo
的引用作为闭包。
将 foo
作为参数传递给 h
并不奇怪:
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
参数标记为 implicit 的函数, 编译器会将其丢弃作为有效的实际参数,因此试图评估它。没有找到一个声明的 implicit 值来满足调用。
如果是这种情况,有什么方法可以表达具有隐式参数的函数类型?