8

为什么不能链接模式匹配结构?例如,以下是合法的,如果荒谬的话,

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 _ => {}
}

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

4

2 回答 2

7

是的,它应该可以工作,因为(几乎)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 _ => {}
}
于 2013-05-04T04:59:39.320 回答
5

你的直觉是正确的;这不是胡说八道——通常你可以以这种方式链接中缀运算符,而无需括号(正如其他用户所建议的那样)。事实上,match它曾经被实现为一个方法——并且作为一个中缀运算符(默认为左关联)——所以你的替代语法会起作用。然而,在 Scala 2.5match中,我们使用了一种特殊的语言结构而不是一种方法。我不知道为什么要这样做,但这就是原因:尽管看起来如此,但它不是中缀运算match

于 2013-05-04T04:56:38.343 回答