gpt4 book ai didi

scala - 为什么 scala 在元组上不隐式匹配?

转载 作者:行者123 更新时间:2023-12-04 19:51:56 25 4
gpt4 key购买 nike

您可以在 ruby​​ 中执行以下操作:

l = [[1, 2], [3, 4], [5, 6]]
m = l.map {|(a, b)| a+b}

但是您不能在 Scala 中执行以下操作:
val a = List((1, 2), (3, 4), (5, 6))

a.map((f, s) => f + s)
<console>:9: error: wrong number of parameters; expected = 1
a.map((f, s) => f + s)

相反,你必须这样做:
a.map { case (f, s) => f + s }

我觉得这很罗嗦,因为 Scala 定义了一个“元组”类型,我希望它也提供语法糖在它上面,以像上面那样隐式匹配。不支持这种匹配有什么深层原因吗?有没有更优雅的方法来做到这一点?

最佳答案

原因

原因是您尝试使用的语法已经有意义。当高阶函数需要两个参数的函数时使用它。例如,使用 reducefold :

List(1,2,3).reduce((a,b) => a+b)

一个办法

可以通过定义自己的隐式方法来实现更简洁的方法:
import scala.collection.generic.CanBuildFrom
import scala.collection.GenTraversableLike

implicit class EnrichedWithMapt2[A, B, Repr](val
self: GenTraversableLike[(A, B), Repr]) extends AnyVal {
def mapt[R, That](f: (A, B) => R)(implicit bf: CanBuildFrom[Repr, R, That]) = {
self.map(x => f(x._1, x._2))
}
}

然后你可以这样做:
val a = List((1, 2), (3, 4), (5, 6))
a.mapt((f, s) => f + s) // List(3, 7, 11)

其他选择

您还可以使用其他一些技巧,例如使用 tupled ,但它们并不能真正帮助您解决您描述的情况:
val g = (f: Int, s: Int) => f + s
a.map(g.tupled)

要不就
a.map(((f: Int, s: Int) => f + s).tupled)

关于scala - 为什么 scala 在元组上不隐式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20432896/

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