加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读