具有模式匹配的Scala部分应用函数

时间:2012-06-20 04:24:43

标签: scala

我是出于好奇而发布这个问题,看看是否有人知道在下列情况下模式匹配是如何工作的。假设我的函数值定义如下:

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补充说,不知怎的,它确定你在匹配的上下文中部分应用了一个函数,所以它会产生不同的东西......

1 个答案:

答案 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
}