在 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
的函数不匹配参数被标记为隐式,编译器将其作为有效的实际参数丢弃,因此尝试评估它。找不到声明的隐式值来完成调用。如果是这样,用隐式参数表达函数类型的方式是什么?
最佳答案
不幸的是,函数不能有隐式参数——只有方法可以。
在表达式 g(1)(foo)
中, foo
从方法转换为函数(也称为 eta 扩展)。和 section 6.26.2的 Scala 规范声明在 eta 扩展之前应用隐式参数。
看这张票:implicit methods behave suboptimally when used non-implicitly
关于scala - 将其传递给高阶函数后,函数隐式参数不再如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32716707/