繁体   English   中英

如何在匿名函数中隐式设置多个参数?

[英]How can I make multiple parameters in an anonymous function implicit?

如果我们有一个接受匿名函数A => B作为参数的方法,则可以在调用中使A隐含。

def impl(a: Int)(f: Int => Int): Int = f(a)

impl(a) { implicit z =>
    ...
}

但是我们可以使用具有多个参数的匿名函数来做到这一点吗?

def impl(a: Int, b: Int)(f: (Int, Int) => Int): Int = f(a, b)

理想情况下,这将类似于:

impl(1, 2) { implicit (a, b) => // wrong
    ...
}

要么

impl(1, 2) { (implicit a, implicit b) => // also wrong
    ...
}

我可以使用A => B => C来解决此问题:

def impl(a: Int, b: Int)(f: Int => Int => Int): Int = f(a)(b)

impl(1, 2) { implicit a => implicit b =>
    ...
}

但是,有没有一种方法可以不使用任何功能呢?

应该很明显,但是Int在这里只是一个虚拟的占位符。

不,不可能。 根据规范的6.23节“ 匿名函数 ”,匿名函数语法为:

Expr            ::=  (Bindings | ['implicit'] id | '_') '=>' Expr
ResultExpr      ::=  (Bindings | (['implicit'] id | '_') ':' CompoundType) '=>' Block
Bindings        ::=  '(' Binding {',' Binding} ')'
Binding         ::=  (id | '_') [':' Type]

如您所见, implicit大小写是特殊情况,只有1个标识符,而重复式大小写Bindings (使用EBNF的重复语法{...} )则排除了implicit使用。

本节中唯一为implicit添加的详细信息是:

匿名函数的命名参数可以选择前面带有隐式修饰符。 在这种情况下,该参数被标记为隐式; 但是,参数部分本身在这里定义的意义上不算作隐式参数部分。 因此,必须始终明确给出匿名函数的参数。

我认为该文本还应阐明这仅适用于单个参数(例如“具有1个参数的匿名函数的命名参数...”)

当然,最简单的解决方法是避开语法糖,并将匿名函数参数重新绑定到新的隐式变量:

impl(a) { (b, c) =>
    implicit val (impB, imbC) = (b, c)
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM