模式匹配“返回”值

2023-11-23

为什么不可能链接模式匹配结构?例如,以下内容是合法的,如果是无意义的,

val a = ADT(5)

val b = a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
} 
b match {
  case ADT(a) if a > 13 => doSomething(a)
  case _ => {}
}

但以下不是:

a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
} match {
  case ADT(a) if a > 13 => doSomething(a)
  case _ => {}
}

我怀疑这是因为我一开始就不应该这样做,但原则上我不明白为什么它不合法。


是的,它应该可以工作,因为(几乎)Scala 中的所有内容都是表达式,并且每个表达式都可以用作模式匹配。

在这种情况下,模式匹配是一个表达式,因此它可以被另一个“链式”模式匹配使用。但编译器不喜欢它。

用括号给编译器一点提示会有所帮助:

case class ADT(value: Int)

val a = ADT(5)

(a match {
  case ADT(a) if a > 4 => ADT(a * 3)
  case ADT(a) => ADT(a + 1)
}) match {
  case ADT(a) if a > 13 => println(a)
  case _ => {}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

模式匹配“返回”值 的相关文章

随机推荐

  • 查找某个点下方的所有窗口

    我想找到桌面上给定点下方的所有顶级窗口 桌面的子窗口 我找不到这方面的 API 我的情况是 我正在屏幕上拖动一个窗口 并希望将其放入另一个 已知 窗口中 我可以测试目标窗口的边界 但这并不能告诉我它是否被另一个 未知 窗口遮挡 使用Wind
  • Spring MVC 中的有序 RequestMapping

    我正在使用带注释的控制器开发 Spring MVC 项目 我感兴趣的一件事是关于顺序 RequestMapping待处理的指令 例如 我想要所有 green basic welcome要映射到GreenController welcome
  • move_uploaded_file 不起作用,没有错误

    我正在运行一个脚本 该脚本移动上传的文件move uploaded file 我已经这样做了数千次 但由于某种原因它不起作用 我已确认以下事项
  • 在 Linux 中使用 Chrome 通过 Selenium 运行 NaCl 辅助进程,不会出现沙箱错误

    我在 Linux 中通过 Selenium 使用 Chrome 时遇到以下错误 ERROR browser main loop cc 1512 Unable to open X display ERROR nacl helper linux
  • 在 IIS 重写规则中排除路径?

    我有一个将 URL 转换为小写的重写规则 我想排除一个文件夹 但不知道正则表达式 如何从下面的规则中排除 myfolder
  • 在 javascript 中的数组文字上调用 forEach 时出错[重复]

    这个问题在这里已经有答案了 当我使用 Node v6 9 2 运行此代码时会生成错误 var req foo bar forEach prop gt console log prop prop 错误是 TypeError Cannot re
  • 在android中从图库和相机捕获图像

    我首先知道这是一个重复的问题 但我在从画廊或相机捕获图像方面没有问题 我在虚拟项目上创建来检查我的代码 它工作正常 但是当我在我的项目中使用相同的代码时 即使我没有收到任何错误 它也不起作用 一旦我开始活动以获取结果 它就会被取消 但我仍然
  • 如何修复 1 字节 UTF-8 序列的无效字节 1

    我正在尝试使用 java 方法从数据库获取以下 xml 但出现错误 用于解析xml的代码 DocumentBuilderFactory dbf DocumentBuilderFactory newInstance DocumentBuild
  • 我什么时候应该使用一对一关系?

    抱歉这个菜鸟问题 但是是否确实需要与数据库中的表使用一对一关系 您可以在一张表中实现所有必需的字段 即使数据变得非常大 您也可以枚举您需要的列名SELECT声明而不是使用SELECT 你什么时候真正需要这种分离 1 到 0 1 超类和子类之
  • 如何创建模块化 JSF 2.0 应用程序?

    我有一个具有明确定义的界面的应用程序 它使用 CDI 来解析模块 具体来说 它使用 API 接口上的 Instance 注入点来解析模块 并通过接口毫无问题地来回传递各种数据 我故意将 API 和实现分开 模块仅从 API 继承以避免紧密耦
  • 从 Delphi REST 服务器返回图像并在浏览器中显示它

    当您在 Delphi Rest 服务器中使用文件流对象返回图像时 它将不会在浏览器中显示 以下是返回图像的示例方法 function TServerClass Image TFileStream begin Result TFileStre
  • java.lang.RuntimeException:Parcel android.os.Parcel:解组未知类型代码

    我的应用程序中似乎出现了一个奇怪的错误 请参阅GitHub 当我将对象传递给实现的不同活动时 就会发生这种情况Parcelable 我在 Stack Overflow 上检查了其他问题和答案 但无法找到解决方案 我已经尝试过答案here 例
  • List 内的 NavigationLink 适用于 HStack 而不是每个元素

    我正在努力追随组合复杂的接口SwiftUI 指南 但在让 NavigationLink 在 iOS 13 beta 3 和现在的 beta 4 上正常工作时遇到问题 如果您只是下载项目文件并尝试运行它 请单击任何 Lake 图像 什么都不会
  • 是否可以在 ASP.NET MVC 路径中的查询字符串变量到达控制器之前更改它?

    我在 ASP NET MVC 中有一个控制器方法 如下所示 public ActionResult GetAlbumPictures int albumId var album AlbumRepo GetSingle albumId var
  • 执行 exe 时出现未知发布者错误

    我已经部署了我的 Windows 应用程序项目 但是当我运行它时 它首先抛出错误 未知发布者 如何隐藏此消息 您必须对包进行数字签名以防止此类错误 http msdn microsoft com library ms172240 aspx
  • Java - 执行 I/O 操作时的线程状态

    假设 Java 线程执行一些 I O 操作 例如使用传统的阻塞 Java I O 读取文件 问题是 等待时线程的状态是什么 我不知道它是正在运行 进行一些主动等待 还是正在等待 也许有某种监视器在文件数据准备好时唤醒线程 我怎样才能找到它
  • 可以在 php 5.2.6 中使用 SplEnum 吗?

    我尝试使用类 abstract class my abstractEnum extends SplEnum and class my categoryEnum extends my abstractEnum 我有 致命错误 未找到 SplE
  • 需要 Gradle 版本 2.2。当前版本是2.10

    我正在尝试使用 gradle 构建 它给了我错误的说法 无法应用插件 id com android library 需要 Gradle 版本 2 2 当前版本是2 10 如果使用 gradle 包装器 请尝试将 home sanjeewa
  • 致命错误:超出最大执行时间 300 秒

    我不断收到此 PHP 错误 致命错误 超出最大执行时间 300 秒 我尝试过设置我的max execution time and my max input timephp ini apache 和 cli 中的设置0 1 and 4000每
  • 模式匹配“返回”值

    为什么不可能链接模式匹配结构 例如 以下内容是合法的 如果是无意义的 val a ADT 5 val b a match case ADT a if a gt 4 gt ADT a 3 case ADT a gt ADT a 1 b mat