美文网首页程序员写作Scala编程与实践SpringBoot极简教程 · Spring Boot
函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编

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

作者: 光剑书架上的书 | 来源:发表于2016-05-05 01:42 被阅读227次

    函数式编程与面向对象编程[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>

    相关文章

      网友评论

        本文标题:函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编

        本文链接:https://www.haomeiwen.com/subject/wrhdrttx.html