匹配表达式语法的动机

时间:2013-07-22 23:14:47

标签: scala syntax pattern-matching

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

expr match {
    case Test(l1) => ...
    ...
}

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

我认为没有合理的解释。我在Scala编程,Scala网站in this paperthis thesis,SO上和网络其他部分都找不到答案。

这并不是说它有什么不妥,只是它是一个完全的谜。当match以这种方式工作时,为什么不iffor

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

1 个答案:

答案 0 :(得分:7)

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

case i if i % 2 == 0 => i / 2

同样有效:

case i if (i % 2 == 0) => i / 2

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

我认为类似的动机在match语法中起作用,而且match (expr) { ... }expr match { ... }相比确实看起来非常糟糕(和误导性)。< / p>

另外,就在今天下午,我在x match { ... }改为Option改为其他人x map { ... }match作为中缀运算符使这两个表达式之间的相似性变得清晰。

关于为什么match不仅仅是一种方法的问题,这是David Pollak在the scala-debate mailing list上提出的一个为期五年的问题:

  

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

Martin Odersky's answer

  

在Scala中它曾经是那种方式1.我不再确定为什么我们改变了。   语法高亮?错误报告?不确定。我不这么认为   无论如何,这都很重要。

我和马丁在这一次。

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

def foo[A, B](f: PartialFunction[A, B])(a: A) = a match f

如果match仍然是Any上的方法,那么需要一大堆案例将是一个相当奇怪的要求。