Scala模式匹配是否对面向对象有害?

Rol*_*olf 2 scala pattern-matching

免责声明:我在Java方面比在Scala(我正在学习)方面更有经验.

在Java中,我已多次阅读过切换可能对面向对象有害,特别是在使用类型时(这种问题也导致了这种情况:http://www.antiifcampaign.com/).

在Scala中,Martin Odersky的介绍视频课程之一展示了模式匹配是如何更好地替代多个"低级" isInstanceOf检查.

虽然模式匹配比简单的Java开关捕获更灵活的模式,但我仍然认为第一个是后者的概括.

不模式匹配和"开启类型"大致共享相同的基本方法?是不是模式匹配只是一些语法糖隐藏了很多isInstanceOf/ asInstanceOf

如果没有,那么模式匹配将如何更灵活(如:对变化具有弹性),而不是自己编写那些低级别检查(除了这个繁琐任务的容易出错的性质)?

Bob*_*ish 6

在某种意义上,模式匹配可能是"语法糖",但它不仅仅是代码替换.

a)match构造将通过确保没有未发现的案例来强制域的完整性,除非您明确指出它只是部分功能.

b)匹配语法不那么冗长.

c)比赛结构包括守卫,符合比赛资格的谓词.

def mergeSort(a: List[Int], b: List[Int]): List[Int] = (a, b) match {
  case (ah :: at, bh :: bt) if ah < bh =>
    ah :: mergeSort(at, b)
  case (ah :: at, bh :: bt) if ah >= bh =>
    bh :: mergeSort(a, bt)
  case (Nil, b) =>
    b
  case (a, Nil) =>
    a
}
Run Code Online (Sandbox Code Playgroud)

d)解构

...
case Node(x, Empty, Empty) =>
  x - 52
...
Run Code Online (Sandbox Code Playgroud)

声明形式更容易阅读(给出一点经验).

编辑:术语"语法糖"经常用于Scala.但是,类型推理和"激进"类型分辨率(例如在模式匹配中使用)可构成强大的语言结构.至于原始问题,模式匹配独立于面向对象,并提供强大的,类型安全的方法来访问数据,这可能使类的使用不那么需要.


dfa*_*fan 5

如果你有n种类型的名词有m种类型的动词,你有nxm名词 - 动词组合来跟踪.

管理这种复杂性有两种很好的策略.

您可以按名词(类)组织代码,每个类都需要能够处理每个动词(方法).这样可以轻松添加新名词.当然,当你添加一个新的动词时,通过你的每个名词并确保它可以处理新的动词是很烦人的.这是面向对象的方法.

您还可以通过动词(函数)组织代码,每个函数都需要能够处理每个名词(模式).这样可以很容易地添加新动词.当然,当你添加一个新名词时,通过每个动词并确保它可以处理新名词很烦人.这是功能性方法.

两种方法都没有明显的改善,两者都得到了很好的使用.但是,当您尝试混合它们时可能会遇到问题,因此通常您希望非常清楚您针对给定问题使用哪种方法.

  • 我还说模式匹配在处理您希望使用多个分派(而不是Scala/Java/JVM使用的单个分派)的情况时也是例外.比较Scala的模式匹配与[在Java中模拟](http://en.wikipedia.org/wiki/Multiple_dispatch#Java). (2认同)