gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:06:27 25 4
gpt4 key购买 nike

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

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 被分配了“匹配的 ”,因为它调用了匹配 'f' 作为值。

所以我的问题是,Scala 如何区分这两者?它们都是函数值并且都是 String => Int 类型。事实上,如果我在运行 match 之前将部分应用的函数值分配给临时变量 tmp,那么它的行为与 f3 相同:
val tmp = f(_: String)
val f4 = tmp match {
case x => "matched: " + x
}

现在 f4 被分配了“匹配的 ”而不是函数 String => Int。

我可以看到想要做的值(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/

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