我出于好奇而发布这个问题,看看是否有人知道模式匹配在以下情况下是如何工作的。假设我有一个定义如下的函数值:
val f = (s: String) => s.toInt
它的类型当然是 String => Int。现在我想创建一个基于模式匹配传递给这个函数的任何输出的新函数。我可以定义如下:
val f2 = f(_: String) match {
case i: Int => i + 2
}
现在我的新函数也来自 String => Int,但它在此过程中添加了 2。它可以被调用如下:
scala> f2("3")
res0: Int = 5
如果我不做部分应用就做同样的事情,那么我会根据函数本身得到一个匹配:
val f3 = f match {
case x => "matched: " + x
}
现在值 f3 被分配了“匹配的
所以我的问题是,Scala 如何区分这两者?它们都是函数值并且都是 String => Int 类型。事实上,如果我在运行 match 之前将部分应用的函数值分配给临时变量 tmp,那么它的行为与 f3 相同:
val tmp = f(_: String)
val f4 = tmp match {
case x => "matched: " + x
}
现在 f4 被分配了“匹配的
我可以看到想要做的值(value),我只是好奇它是如何完成的。这只是 Scala 添加的一些魔法吗?它以某种方式发现您在匹配的上下文中部分应用了一个函数,因此它会生成一些不同的东西......
最佳答案
这就是下划线的工作方式。
f(_: String) match {
case i: Int => i + 2
}
是一个简写
(x: String) => (f(x) match {
case i: Int => i + 2
})
(添加括号使事情更清楚)但您的其他示例等效于
(x: String => f(x)) match {
case y => "matched: " + y
}
关于带有模式匹配的 Scala 部分应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11112782/