gpt4 book ai didi

scala - 如何使匿名函数中的多个参数隐式?

转载 作者:行者123 更新时间:2023-12-04 15:21:33 24 4
gpt4 key购买 nike

如果我们有一个接受匿名函数的方法 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 Anonymous Functions 部分在规范中,匿名函数语法是:

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

如您所见, implicit case 是特殊的,只有 1 个标识符,而重复的 case Bindings (它使用 EBNF 的重复语法 {...} )排除了使用 implicit .
implicit 唯一添加的详细信息本节有:

A named parameter of an anonymous function may be optionally preceded by an implicit modifier. In that case the parameter is labeled implicit; however the parameter section itself does not count as an implicit parameter section in the sense defined here. Hence, arguments to anonymous functions always have to be given explicitly.



我认为这段文字还应该澄清这仅适用于单个参数(例如“一个匿名函数的命名参数,它恰好具有 1 个参数......”)

当然,最简单的解决方法是避开语法糖并将匿名函数参数重新绑定(bind)到新的隐式变量:
impl(a) { (b, c) =>
implicit val (impB, imbC) = (b, c)
...
}

关于scala - 如何使匿名函数中的多个参数隐式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29849700/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com