函数文字难题上的隐式参数

问题描述

我试图弄清楚函数文字是否可以包含隐式参数。

我在下面的文章中发现函数文字不能,因为它是不带隐式参数的FunctionN对象。

Scala Functional Literals with Implicits

但是答案中却包含着把戏作为窍门

val sum2 = (a: Int) => {implicit b: Int => a + b}

我尝试使用它,但是我不确定它为什么编译以及implicit b: Int => a + b的确切含义。

我尝试例如

val sum2 = (a: Int) => {(implicit b: Int) => a + b}

val sum2 = (a: Int) => {implicit (b: Int) => a + b}

两者都不编译。在这两种情况下,我的假设都是我们在implicit b: Int => a + b中返回一个函数文字。如果是这样,为什么上面的构造不起作用。以及为什么以下构造起作用的原因:

val sum2 = (e:Int) => { (f:Int) => e + f}

有人可以帮助我了解这里的情况吗?我觉得这很奇怪而且难以理解。

解决方法

这实际上不是用隐式参数创建函数。该函数仍然只有一个普通的显式参数,只是在该函数的主体中该参数也是隐式值。

这与您将要执行的操作完全相同:

{ b: Int => implicit val bImplicit: Int = b; a + b }

因此,在您的情况下,这毫无用处,因为调用函数b

时仍然必须显式地传递sum2(1)(2) ,

如果是这样,为什么上面的构造不起作用。

因为SLS 6.23 Anonymous Functions将语法指定为

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

请注意EBNF表示法(‘(’之间含义的不同。前一个意思是grouping。如果以下情况合法

(implicit b: Int) => ???

然后,ResultExpr规则将指定‘(’‘)’,类似于它们在Bindings规则中的显示方式。

此外,在同一SLS部分

可以可选地在匿名函数的命名参数之前 通过隐式修饰符。在这种情况下,该参数被标记为 隐含的但是参数部分本身不算作 隐式参数部分。因此,匿名函数的参数 总是必须明确给出。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...