匹配表达式语法的动机

Lii*_*Lii 3 syntax scala pattern-matching

匹配表达式的语法非常好:

expr match {
    case Test(l1) => ...
    ...
}
Run Code Online (Sandbox Code Playgroud)

但它让我疯狂,我不明白为什么使用这种语法代替的动机match (expr) ...,就像在一个体面的C后代中的分支语句一样!

我认为没有合理的解释.我没有在Scala编程,Scala网站,本文,本论文中找到答案,这里是关于SO的,也不是网络的其他部分.

这并不是说它有什么不妥,只是它是一个完全的谜.当match以这种方式工作,为什么不if和for也?

有人知道吗?如果没有发现这一点,我认为我不能再忍受这种语言了.我一直在想.我晚上睡不着觉.

Tra*_*own 7

为了采用类似的Scala语法,模式匹配案例中的保护不需要围绕其条件表达式使用括​​号 - 例如,以下内容:

case i if i % 2 == 0 => i / 2
Run Code Online (Sandbox Code Playgroud)

就像这样有效:

case i if (i % 2 == 0) => i / 2
Run Code Online (Sandbox Code Playgroud)

坚持C族风格意味着需要后一种形式,即使括号不是消除歧义所必需的.Scala语言设计师决定在这种情况下减少线路噪声,以保持家族相似性.

我猜这种类似的动机在match语法上起作用,而且与我match (expr) { ... }相比,确实看起来确实非常糟糕(和误导性)expr match { ... }.

此外,就在今天下午我重构别人的x match { ... }上Option,以x map { ... }代替.match作为中缀运算符使这两个表达式之间的相似性变得清晰.

关于为什么问题match不只是一个方法,这里是从大卫波拉克在五岁问题的scala-debate邮件列表:

为什么'匹配'是语言级别构造而不是Any上的方法?

而Martin Odersky的回答是:

它曾经是Scala 1中的那种方式.我不再确定为什么我们改变了.语法高亮?错误报告?不确定.不过,我认为这不重要.

我和马丁在这一次.

请注意,存在一些实际差异(除了简单的"点或非"问题).例如,这不编译:

def foo[A, B](f: PartialFunction[A, B])(a: A) = a match f
Run Code Online (Sandbox Code Playgroud)

如果match仍然是一个方法Any,需要一堆文字将是一个相当奇怪的要求.