Rol*_*olf 2 scala pattern-matching
免责声明:我在Java方面比在Scala(我正在学习)方面更有经验.
在Java中,我已多次阅读过切换可能对面向对象有害,特别是在使用类型时(这种问题也导致了这种情况:http://www.antiifcampaign.com/).
在Scala中,Martin Odersky的介绍视频课程之一展示了模式匹配是如何更好地替代多个"低级" isInstanceOf检查.
虽然模式匹配比简单的Java开关捕获更灵活的模式,但我仍然认为第一个是后者的概括.
不模式匹配和"开启类型"大致共享相同的基本方法?是不是模式匹配只是一些语法糖隐藏了很多isInstanceOf/ asInstanceOf?
如果没有,那么模式匹配将如何更灵活(如:对变化具有弹性),而不是自己编写那些低级别检查(除了这个繁琐任务的容易出错的性质)?
在某种意义上,模式匹配可能是"语法糖",但它不仅仅是代码替换.
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.但是,类型推理和"激进"类型分辨率(例如在模式匹配中使用)可构成强大的语言结构.至于原始问题,模式匹配独立于面向对象,并提供强大的,类型安全的方法来访问数据,这可能使类的使用不那么需要.
如果你有n种类型的名词有m种类型的动词,你有nxm名词 - 动词组合来跟踪.
管理这种复杂性有两种很好的策略.
您可以按名词(类)组织代码,每个类都需要能够处理每个动词(方法).这样可以轻松添加新名词.当然,当你添加一个新的动词时,通过你的每个名词并确保它可以处理新的动词是很烦人的.这是面向对象的方法.
您还可以通过动词(函数)组织代码,每个函数都需要能够处理每个名词(模式).这样可以很容易地添加新动词.当然,当你添加一个新名词时,通过每个动词并确保它可以处理新名词很烦人.这是功能性方法.
两种方法都没有明显的改善,两者都得到了很好的使用.但是,当您尝试混合它们时可能会遇到问题,因此通常您希望非常清楚您针对给定问题使用哪种方法.
| 归档时间: |
|
| 查看次数: |
279 次 |
| 最近记录: |