具有模式匹配的Scala部分应用函数
发布时间:2020-12-16 09:52:49 所属栏目:安全 来源:网络整理
导读:我出于好奇而发布这个问题,看看是否有人知道模式匹配在以下情况下是如何工作的.假设我的函数值定义如下: val f = (s: String) = s.toInt 它的类型当然是String =诠释.现在我想创建一个基于模式匹配传递给该函数的输出的新函数.我可以定义如下: val f2 = f(
我出于好奇而发布这个问题,看看是否有人知道模式匹配在以下情况下是如何工作的.假设我的函数值定义如下:
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补充说,不知怎的,它确定你在匹配的上下文中部分应用了一个函数,所以它会产生不同的东西…… 解决方法
这就是强调工作的方式.
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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |