加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

具有模式匹配的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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读