我是出于好奇而发布这个问题,看看是否有人知道在下列情况下模式匹配是如何工作的。假设我的函数值定义如下:
val f = (s: String) => s.toInt
它的类型当然是String =>诠释。现在我想创建一个基于模式匹配传递给该函数的输出的新函数。我可以如下定义:
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被指定为“匹配< function1>”因为它调用匹配'f'作为值。
所以我的问题是,Scala如何区分这两者?它们都是函数值,两者都是String =>类型。诠释。实际上,如果我在运行匹配之前将部分应用的函数值分配给临时变量tmp,那么它的行为与f3相同:
val tmp = f(_: String)
val f4 = tmp match {
case x => "matched: " + x
}
现在为f4分配了“匹配< function1>”而不是一个函数String =>中间体
我可以看到想要做的任何一个值,我只是好奇它是如何完成的。这只是一些神奇的Scala补充说,不知怎的,它确定你在匹配的上下文中部分应用了一个函数,所以它会产生不同的东西......
答案 0 :(得分:9)
这就是下划线的工作方式。
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
}