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

简介: 函数式编程与面向对象编程[3]:Scala的OOP-FP混合式编程与抽象代数理论之剑 2016.5.4 23:55:19Scala的设计哲学Object-Oriented Meets Functional---当面向对象遇上函数式:Have the best of both worlds.

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

相关文章
|
30天前
|
缓存 分布式计算 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(一)
40 0
|
30天前
|
分布式计算 算法 大数据
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
大数据-90 Spark 集群 RDD 编程-高阶 RDD容错机制、RDD的分区、自定义分区器(Scala编写)、RDD创建方式(二)
45 0
|
6月前
|
消息中间件 分布式计算 Java
Scala函数式编程【从基础到高级】
Scala函数式编程【从基础到高级】
|
4月前
|
Scala 开发者
Scala中的模式匹配与高阶函数:探索强大的编程范式
【7月更文挑战第11天】Scala中的模式匹配和高阶函数是两种极其强大的特性,它们不仅提升了代码的表达力和可读性,还使得开发者能够编写出更加灵活和可重用的解决方案。通过
|
4月前
|
存储 监控 BI
上网行为管理软件中的Scala函数式编程
**使用Scala进行上网行为管理**\n本文探讨了如何利用Scala的函数式编程特性来监控和管理上网行为。示例中,定义了`WebActivity`案例类来存储数据,通过集合操作如`filter`, `map`和`foldLeft`处理数据,统计用户访问次数和活动。此外,还展示了如何使用HTTP库自动提交数据到网站。Scala的这种方法提高了数据处理效率,确保一致性和安全性。
49 0
|
6月前
|
安全 编译器 Scala
何时需要指定泛型:Scala编程指南
本文是Scala编程指南,介绍了何时需要指定泛型类型参数。泛型提供代码重用和类型安全性,但在编译器无法推断类型、需要提高代码清晰度、调用泛型方法或创建泛型集合时,应明确指定类型参数。通过示例展示了泛型在避免类型错误和增强编译时检查方面的作用,强调了理解泛型使用时机对编写高效Scala代码的重要性。
45 1
何时需要指定泛型:Scala编程指南
|
6月前
|
人工智能 安全 人机交互
Scala 05 —— 函数式编程底层逻辑
Scala讲座探讨了函数式编程的底层逻辑,强调无副作用和确定性。函数式编程的核心是纯函数,避免读写数据等副作用,将其移至代码边缘处理。函数输入输出应清晰定义,避免模糊参数。函数视为数据范畴间的映射,以范畴论为基础。业务逻辑转化为纯函数式,通过声明式编程实现解耦,关注输入输出而非过程,便于验证和自动编程。将业务逻辑视作流水线,每个函数处理数据,避免全局变量和`var`,优先确保正确性再优化效率。
47 1
Scala 05 —— 函数式编程底层逻辑
|
6月前
|
Java Scala
scala中的面向对象编程
scala中的面向对象编程
30 3
|
6月前
|
消息中间件 分布式计算 大数据
Scala学习--day03--函数式编程
Scala学习--day03--函数式编程
|
6月前
|
数据采集 监控 安全
通过Scala实现局域网监控上网记录分析:函数式编程的优雅之路
在当今数字时代,网络监控成为保障信息安全的必要手段之一。本文将介绍如何使用Scala编程语言实现局域网监控上网记录分析的功能,重点探讨函数式编程的优雅之路。通过一系列代码示例,我们将展示如何利用Scala的函数式特性和强大的语法来实现高效的监控和分析系统。
248 1