scala – 在将其传递给更高阶函数之后,函数隐式参数不再如此
发布时间:2020-12-16 08:58:33 所属栏目:安全 来源:网络整理
导读:在 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: In
在
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 =>单元与Int参数标记为隐式的函数不匹配,编译器将其作为有效的实际参数丢弃,因此尝试对其进行求值.未找到声明的隐含值来完成调用. 如果是这种情况,那么用隐式参数表达函数类型的方式是什么? 解决方法
不幸的是,函数不能有隐式参数 – 只有方法可以.
在表达式g(1)(foo)中,foo从方法转换为函数(也称为eta-expansion).并且section 6.26.2 Scala规范规定在eta扩展之前应用隐式参数. 见此票:implicit methods behave suboptimally when used non-implicitly (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |