如何解决函数文字难题上的隐式参数
我试图弄清楚函数文字是否可以包含隐式参数。
我在下面的文章中发现函数文字不能,因为它是不带隐式参数的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部分
可以可选地在匿名函数的命名参数之前 通过隐式修饰符。在这种情况下,该参数被标记为 隐含的但是参数部分本身不算作 隐式参数部分。因此,匿名函数的参数 总是必须明确给出。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。