函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编程与抽象代数理论

函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编程与抽象代数理论


之剑 2016.5.4 23:55:19

<div id="category"></div>


Scala的设计哲学

Object-Oriented Meets Functional---当面向对象遇上函数式:

Have the best of both worlds. Construct elegant class hierarchies for maximum code reuse and extensibility, implement their behavior using higher-order functions. Or anything in-between.

典型特征

  • 支持面向对象编程范式
  • 支持函数式编程范式
  • 语法动态简洁表达力丰富
  • 具备静态强类型和丰富的泛型

Scala, A Scalable language

Scala,一个可扩展的语言. Scala精心整合了面向对象和函数式编程语言。

面向对象(Object-Oriented)

Scala是纯种的面向对象的语言。从概念上讲,每一个值都是一个对象,每一个操作都是一个方法调用。语言支持通过类和特征的高级组件架构。

面向对象编程是一种自顶向下的程序设计方法.万事万物都是对象,对象有其行为(方法),状态(成员变量,属性).

许多传统的设计模式Scala已经原生支持。单例模式对应object对象定义,访问者通过模式匹配支持。使用隐式类,Scala甚至允许你对现有类型类进行操作,无论他们来自Scala或java!

函数式编程(Functional)

Scala也是骨子里透着函数式编程范式的语言。函数是一等公民(当然,这个在你使用面向对象编程范式风格的时候,这个函数公民也只能退后了),不可变数据结构库等。不变性有助于编写并发程序.

函数式编程方法通过组合和应用函数来构造逻辑系统.函数式编程倾向于把软件分解为其需要执行的行为或操作,而且通常采用自底向上的方法.同时,函数式编程也提供了非常强大的对事物进行抽象和组合的能力.

Scala不固执己见;你可以自由使用任何你喜欢的风格。面对有多种不同需求的问题领域,你可以在一个解决方案的不同部分,采用最适合的编程方法.

除了命令式,函数式,还有哪些其他的编程范式?

与JVM的无缝集成(Seamless Java Interop)

Scala在JVM上运行。java和Scala类可以自由地混合,无论他们居住在不同项目或同一项目。Scala可以自由使用java库、框架和工具。像Ant或Maven工具,IDE如Eclipse或NetBeans,框架,IntelliJ,Spring。

Scala可以运行在所有常见的JVM, 当然还有Android OS。 甚至,Scala都想把前端JavaScript的事情也给干了.

Scala社区是java生态系统的重要组成部分。流行的Scala框架,包括Akka, Finagle, and the Play web framework include dual APIs for Java and Scala.

函数式编程的思想是开发一个小的核心结构,可结合灵活的方式,然后进行组合。

Future-Proof

Scala particularly shines when it comes to scalable server software that makes use of concurrent and synchronous processing, parallel utilization of multiple cores, and distributed processing in the cloud. 未来Scala在可伸缩的服务器软件,利用并行和同步处理,多核并行使用,在云计算的分布式处理等领域将大放异彩。

Its functional nature makes it easier to write safe and performant multi-threaded code. There’s typically less reliance on mutable state and Scala’s futures and actors provide powerful tools for organizing concurrent system at a high-level of abstraction.

抽象代数理论

每一次“扬弃”都抛弃了一些非本质特征而提炼出更普适的精髓特征,因而每一次抽象都是在透过现象看本质,每一次提炼都是一次质的飞跃和升华,从而使由此得到的新理论更具普遍性与包容性。例如量子力学不仅能解释经典力学的各种现象,还能解释微观世界里特有的(不能被经典力学或经典电动力学解释的)现象,如AB效应。

直观感性的形象思维方式:几何

曾经我很迷恋几何(各种奇妙曲线和曲面),就像当初迷恋普通物理(各种奇妙现象);现在我转向理论物理,更愿意从纯理性的角度去思考一些本质(透过现象看本质),对数学也因而更偏重代数。代数和理论物理的美是内敛的,就像那种内敛的人,长得很抽象,你不去接近她而只是从外部看看,就不会发现她的魅力所在。

代数与抽象思维

从直角三角形的直观,到勾股定理的抽象,再到三角函数的演绎,再到傅里叶变换,小波变换,都是思维层次一步步的高层抽象.

抽象有什么好?抽象可以使理论更加普适。什么欧式几何、仿射几何、射影几何、微分几何… 林林总总,眼花缭乱。它们之间就没有联系吗?有!不识几何真面目,只缘身在几何中——必须从几何中跳出来,才能旁观者清。这个旁观者就是代数。

1872年,德国数学家Klein在Erlangen大学的报告中指出,一种几何学可以用公理化方法来构建,也可以把变换群和几何学联系起来,给几何学以新的定义:

给出集合S和它的一个变换群G,对于S中的两个集合A和B,如果在G中存在一个变换f使f(A)=B,则称A和B等价。

可以根据等价关系给集合分类,凡是等价的子集属于同一类,不等价的子集属于不同的类。将这一代数理论翻译到几何中,相应的版本便是:

集合S叫做空间,S的元素叫做点,S的子集A和B叫做图形,凡是等价的图形都属于同一类(图形等价类)。

于是同一类里的一切图形所具有的几何性质必是变换群G下的不变量,因而可用变换群来研究几何学——这就是著名的Erlangen纲领,它支配了自它以来半个世纪的所有几何学的研究。

例如,在正交变换群下保持几何性质不变的便是欧式几何,在仿射变换群下保持不变的便是仿射几何,在射影变换群下保持不变的便是射影几何,在微分同胚群下保持不变的便是微分几何。

上面说的是图形等价关系。代数的普遍性在于,它将各种各样的相关的、不相关的事物放在一起比较,然后从这些个性的事物中提炼出共性的东西来,比如等价关系。除了上面提到的图形等价关系,还有各种各样的等价关系(如同“群公理:只要满足能封闭、可结合、有恒元和逆元的集合就是群”一样,只要满足反身、对偶、传递这三条的关系就是等价关系——这样简单的条件当然很容易满足,‘曲不高则和不寡’,所以类似的例子不胜枚举)

例如,同余等价关系。我们可以按余数给整数分类,余数相同的归为一类,即同余类。

代数对于普遍性的追求在于,发现同余类后并不就此止步,而是精益求精,进一步去提炼更具普遍性的概念。

既然等价的图形和等价的余数都可以归为等价类,何不将等价类做成一个集合呢?由此,又发现了商集(即在一个集合中给定了一个等价关系之后相对于这个等价关系而言的等价类所构成的集合,通俗地说就是将每一个等价类中所有点“粘合”为一个点而得到的集合,如Möbius带和Klein瓶)、商空间(以同余类为元素构成的集合)、商群(以陪集为元素构成的集合)。

刚才说了等价关系。类似的例子还有很多,再比如说基矢。只要同类的一组元素互不相关,就能充当空间的一组基(将一个量展开为其他量的线性组合,此即泛函分析中的谱定理),哪怕它不是向量(因而生成的不是几何空间)也无所谓,比如它可以是一组函数(由此生成无限维空间,如量子力学中的Hilbert空间)。甚至,它可以是一个不确定(如无穷小量,要多小有多小但又不是零,到底多大只有上帝清楚)的微分元(比如dx、dy、dz,微分几何中用到的外微分形式就是用这些微分元为基矢张成的空间——微分几何运算很复杂,但构成它的理论基础之一Grassmann代数并不是特别复杂)。

代数的理论是相当普适的。因为它总是通过不断的抽象来提炼更加基本的概念。

用哲学的话说,便是从具体到抽象,从特殊到一般(例如两个群,不论它们的元素多么地不同,只要运算性质相同,彼此就是同构的,并且可以因此认为是相同的代数对象而不加区别;不论膨胀、收缩、转动、反演…都可以统一起来,那就是指数函数;不论弦振动、声音、流体、电磁波…都可以统一起来,它们在数学中都是双曲型方程)。


每一次抽象都是一次“扬弃”(留其精髓,去其平庸)的过程。

比如将“距离”概念抽象化而提炼出“单比”概念,进一步将“单比”抽象化而提炼出“交比”概念,于是,从欧式几何中舍弃“距离不变”而保留更普遍的“单比不变”,得到仿射几何;从仿射几何中舍弃“单比不变”而保留更普遍的“交比”,得到一般的射影几何。

从欧式空间(长度,夹角)到内积空间(模,不严格的夹角)再到赋范空间(范,完全抛弃夹角)也是如此,不断的改良(抽象、提炼),一改再改,但最终改到不能再改时,就完成了一个革命——甚至连范数(最熟悉因而最不愿抛弃的度量或度规)也抛弃了,从不严格的距离发展到不确定的距离(邻域δ,就像前面提到的无穷小量一样不确定),得到了里程碑式的“拓扑空间”的概念——有史以来最广泛最深刻的革命!

经由欧式空间的连续函数抽象出度量空间的连续映射,一直到抽象出拓扑空间中的同胚映射,在数学史上经历了很长时间才完成。无独有偶,物理学史也是如此。且不说从经典力学到相对论、量子力学(这个过程想必大家都听腻了),单说相对论本身也是如此。

Einstein说:“为什么从狭义相对论发表到广义相对论建立又经历了7年那么长时间?主要原因是,要摆脱坐标必须有直接度量意义这个旧概念是不容易的”。

看来,物理学家和数学家都遇到了摆脱“度量”概念的困难,在摆脱旧概念走向新理论这一点上物理学界和数学界是相通的(数学界走向了拓扑学,物理学界走向了广义相对论)。


关于作者: 陈光剑,江苏东海人, 号行走江湖一剑客,字之剑。程序员,诗人, 作家

http://universsky.github.io/


<link rel="stylesheet" href="http://yandex.st/highlightjs/6.2/styles/googlecode.min.css">

<script src="http://code.jquery.com/jquery-1.7.2.min.js"></script> <script src="http://yandex.st/highlightjs/6.2/highlight.min.js"></script>

<script>hljs.initHighlightingOnLoad();</script> <script type="text/javascript"> $(document).ready(function(){ $("h2,h3,h4,h5,h6").each(function(i,item){ var tag = $(item).get(0).localName; $(item).attr("id","wow"+i); $("#category").append('<a class="new'+tag+'" href="#wow'+i+'">'+$(this).text()+'</a></br>'); $(".newh2").css("margin-left",0); $(".newh3").css("margin-left",20); $(".newh4").css("margin-left",40); $(".newh5").css("margin-left",60); $(".newh6").css("margin-left",80); }); }); </script>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯NEXT学位

你需要知道的算法之基础篇

3897
来自专栏窗户

斐波那契数列的算法分析

看过我其他一些文章的人,可能想象不出我会写一篇关于斐波那契数列的文章。因为可能会感觉1,1,2,3…这样一个数列能讲出什么高深的名堂?嗯,本篇文章的确是关于斐氏...

4612
来自专栏机器之心

机器学习时代的哈希算法,将如何更高效地索引数据

2335
来自专栏灯塔大数据

每周学点大数据 | No.31拓扑排序

No.31期 拓扑排序 Mr. 王:很好,你还记得这个问题。接下来我们来讨论另一种磁盘中的大数据算法策略,叫作时间前向处理方法。在这种策略中,我会讲解求解最...

3717
来自专栏小L的魔法馆

第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--I-填空题

3405
来自专栏奇点大数据

遗传算法(2)

在遗传算法中我们再举一个求极大值的例子。这种例子也是比较多见的,只要我们把一些数据关系描述成函数之后就会有一些求极大值或者极小值的问题。 其实极大值和极小值是一...

34612
来自专栏懒人开发

(7.7)James Stewart Calculus 5th Edition:Approximate Integration

黎曼求和,我们把对应的[a, b]分成n份,每份大概为 Δx = (b - a)/n 这个时候,有:

1813
来自专栏工科狗和生物喵

【计算机本科补全计划】CCF计算机职业资格认证 2016-04-1/2(俄罗斯方块)详解

正文之前 果然,上一篇文章结尾的预言果然一语成谶,2016-09-4我果然没做出来。没错,昨晚到现在都没有做出来,当然,也是我做了一晚上心灰意冷,然后去欺负本文...

4369
来自专栏小樱的经验随笔

ACM训练计划

看完人家的博客,发现任重道远。。。 一位高手对我的建议: 一般要做到50行以内的程序不用调试、100行以内的二分钟内调试成功.acm主要是考算法的,主要时间...

48610
来自专栏算法channel

AI 路上,第一步这么走下去...

算法是描述解决一个问题的步骤,外界给它所指定的数据,然后经过一系列步骤输出一个结果。为了更快更轻量级地解决问题,我们会选择高效精简的结构去实现,这种结构称为数据...

1256

扫码关注云+社区

领取腾讯云代金券