函數(shù)式編程與面向?qū)ο缶幊蘙3]:Scala的OOP-FP混合式編程與抽象代數(shù)理論

函數(shù)式編程與面向?qū)ο缶幊蘙3]:Scala的OOP-FP混合式編程與抽象代數(shù)理論


之劍 2016.5.4 23:55:19


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


Scala的設(shè)計(jì)哲學(xué)

Object-Oriented Meets Functional---當(dāng)面向?qū)ο笥錾虾瘮?shù)式:

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.

典型特征

  • 支持面向?qū)ο缶幊谭妒?/li>
  • 支持函數(shù)式編程范式
  • 語法動(dòng)態(tài)簡(jiǎn)潔表達(dá)力豐富
  • 具備靜態(tài)強(qiáng)類型和豐富的泛型

Scala, A Scalable language

Scala,一個(gè)可擴(kuò)展的語言.
Scala精心整合了面向?qū)ο蠛秃瘮?shù)式編程語言。

面向?qū)ο?Object-Oriented)

Scala是純種的面向?qū)ο蟮恼Z言。從概念上講,每一個(gè)值都是一個(gè)對(duì)象,每一個(gè)操作都是一個(gè)方法調(diào)用。語言支持通過類和特征的高級(jí)組件架構(gòu)。

面向?qū)ο缶幊淌且环N自頂向下的程序設(shè)計(jì)方法.萬事萬物都是對(duì)象,對(duì)象有其行為(方法),狀態(tài)(成員變量,屬性).

許多傳統(tǒng)的設(shè)計(jì)模式Scala已經(jīng)原生支持。單例模式對(duì)應(yīng)object對(duì)象定義,訪問者通過模式匹配支持。使用隱式類,Scala甚至允許你對(duì)現(xiàn)有類型類進(jìn)行操作,無論他們來自Scala或java!

函數(shù)式編程(Functional)

Scala也是骨子里透著函數(shù)式編程范式的語言。函數(shù)是一等公民(當(dāng)然,這個(gè)在你使用面向?qū)ο缶幊谭妒斤L(fēng)格的時(shí)候,這個(gè)函數(shù)公民也只能退后了),不可變數(shù)據(jù)結(jié)構(gòu)庫等。不變性有助于編寫并發(fā)程序.

函數(shù)式編程方法通過組合和應(yīng)用函數(shù)來構(gòu)造邏輯系統(tǒng).函數(shù)式編程傾向于把軟件分解為其需要執(zhí)行的行為或操作,而且通常采用自底向上的方法.同時(shí),函數(shù)式編程也提供了非常強(qiáng)大的對(duì)事物進(jìn)行抽象和組合的能力.

Scala不固執(zhí)己見;你可以自由使用任何你喜歡的風(fēng)格。面對(duì)有多種不同需求的問題領(lǐng)域,你可以在一個(gè)解決方案的不同部分,采用最適合的編程方法.

除了命令式,函數(shù)式,還有哪些其他的編程范式?

與JVM的無縫集成(Seamless Java Interop)

Scala在JVM上運(yùn)行。java和Scala類可以自由地混合,無論他們居住在不同項(xiàng)目或同一項(xiàng)目。Scala可以自由使用java庫、框架和工具。像Ant或Maven工具,IDE如Eclipse或NetBeans,框架,IntelliJ,Spring。

Scala可以運(yùn)行在所有常見的JVM, 當(dāng)然還有Android OS。
甚至,Scala都想把前端JavaScript的事情也給干了.

Scala社區(qū)是java生態(tài)系統(tǒng)的重要組成部分。流行的Scala框架,包括Akka, Finagle, and the Play web framework include dual APIs for Java and Scala.

函數(shù)式編程的思想是開發(fā)一個(gè)小的核心結(jié)構(gòu),可結(jié)合靈活的方式,然后進(jìn)行組合。

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在可伸縮的服務(wù)器軟件,利用并行和同步處理,多核并行使用,在云計(jì)算的分布式處理等領(lǐng)域?qū)⒋蠓女惒省?/p>

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.

抽象代數(shù)理論

每一次“揚(yáng)棄”都拋棄了一些非本質(zhì)特征而提煉出更普適的精髓特征,因而每一次抽象都是在透過現(xiàn)象看本質(zhì),每一次提煉都是一次質(zhì)的飛躍和升華,從而使由此得到的新理論更具普遍性與包容性。例如量子力學(xué)不僅能解釋經(jīng)典力學(xué)的各種現(xiàn)象,還能解釋微觀世界里特有的(不能被經(jīng)典力學(xué)或經(jīng)典電動(dòng)力學(xué)解釋的)現(xiàn)象,如AB效應(yīng)。

直觀感性的形象思維方式:幾何

曾經(jīng)我很迷戀幾何(各種奇妙曲線和曲面),就像當(dāng)初迷戀普通物理(各種奇妙現(xiàn)象);現(xiàn)在我轉(zhuǎn)向理論物理,更愿意從純理性的角度去思考一些本質(zhì)(透過現(xiàn)象看本質(zhì)),對(duì)數(shù)學(xué)也因而更偏重代數(shù)。代數(shù)和理論物理的美是內(nèi)斂的,就像那種內(nèi)斂的人,長(zhǎng)得很抽象,你不去接近她而只是從外部看看,就不會(huì)發(fā)現(xiàn)她的魅力所在。

代數(shù)與抽象思維

從直角三角形的直觀,到勾股定理的抽象,再到三角函數(shù)的演繹,再到傅里葉變換,小波變換,都是思維層次一步步的高層抽象.

抽象有什么好?抽象可以使理論更加普適。什么歐式幾何、仿射幾何、射影幾何、微分幾何… 林林總總,眼花繚亂。它們之間就沒有聯(lián)系嗎?有!不識(shí)幾何真面目,只緣身在幾何中——必須從幾何中跳出來,才能旁觀者清。這個(gè)旁觀者就是代數(shù)。

1872年,德國(guó)數(shù)學(xué)家Klein在Erlangen大學(xué)的報(bào)告中指出,一種幾何學(xué)可以用公理化方法來構(gòu)建,也可以把變換群和幾何學(xué)聯(lián)系起來,給幾何學(xué)以新的定義:

給出集合S和它的一個(gè)變換群G,對(duì)于S中的兩個(gè)集合A和B,如果在G中存在一個(gè)變換f使f(A)=B,則稱A和B等價(jià)。

可以根據(jù)等價(jià)關(guān)系給集合分類,凡是等價(jià)的子集屬于同一類,不等價(jià)的子集屬于不同的類。將這一代數(shù)理論翻譯到幾何中,相應(yīng)的版本便是:

集合S叫做空間,S的元素叫做點(diǎn),S的子集A和B叫做圖形,凡是等價(jià)的圖形都屬于同一類(圖形等價(jià)類)。

于是同一類里的一切圖形所具有的幾何性質(zhì)必是變換群G下的不變量,因而可用變換群來研究幾何學(xué)——這就是著名的Erlangen綱領(lǐng),它支配了自它以來半個(gè)世紀(jì)的所有幾何學(xué)的研究。

例如,在正交變換群下保持幾何性質(zhì)不變的便是歐式幾何,在仿射變換群下保持不變的便是仿射幾何,在射影變換群下保持不變的便是射影幾何,在微分同胚群下保持不變的便是微分幾何。

上面說的是圖形等價(jià)關(guān)系。代數(shù)的普遍性在于,它將各種各樣的相關(guān)的、不相關(guān)的事物放在一起比較,然后從這些個(gè)性的事物中提煉出共性的東西來,比如等價(jià)關(guān)系。除了上面提到的圖形等價(jià)關(guān)系,還有各種各樣的等價(jià)關(guān)系(如同“群公理:只要滿足能封閉、可結(jié)合、有恒元和逆元的集合就是群”一樣,只要滿足反身、對(duì)偶、傳遞這三條的關(guān)系就是等價(jià)關(guān)系——這樣簡(jiǎn)單的條件當(dāng)然很容易滿足,‘曲不高則和不寡’,所以類似的例子不勝枚舉)

例如,同余等價(jià)關(guān)系。我們可以按余數(shù)給整數(shù)分類,余數(shù)相同的歸為一類,即同余類。

代數(shù)對(duì)于普遍性的追求在于,發(fā)現(xiàn)同余類后并不就此止步,而是精益求精,進(jìn)一步去提煉更具普遍性的概念。

既然等價(jià)的圖形和等價(jià)的余數(shù)都可以歸為等價(jià)類,何不將等價(jià)類做成一個(gè)集合呢?由此,又發(fā)現(xiàn)了商集(即在一個(gè)集合中給定了一個(gè)等價(jià)關(guān)系之后相對(duì)于這個(gè)等價(jià)關(guān)系而言的等價(jià)類所構(gòu)成的集合,通俗地說就是將每一個(gè)等價(jià)類中所有點(diǎn)“粘合”為一個(gè)點(diǎn)而得到的集合,如M?bius帶和Klein瓶)、商空間(以同余類為元素構(gòu)成的集合)、商群(以陪集為元素構(gòu)成的集合)。

剛才說了等價(jià)關(guān)系。類似的例子還有很多,再比如說基矢。只要同類的一組元素互不相關(guān),就能充當(dāng)空間的一組基(將一個(gè)量展開為其他量的線性組合,此即泛函分析中的譜定理),哪怕它不是向量(因而生成的不是幾何空間)也無所謂,比如它可以是一組函數(shù)(由此生成無限維空間,如量子力學(xué)中的Hilbert空間)。甚至,它可以是一個(gè)不確定(如無窮小量,要多小有多小但又不是零,到底多大只有上帝清楚)的微分元(比如dx、dy、dz,微分幾何中用到的外微分形式就是用這些微分元為基矢張成的空間——微分幾何運(yùn)算很復(fù)雜,但構(gòu)成它的理論基礎(chǔ)之一Grassmann代數(shù)并不是特別復(fù)雜)。

代數(shù)的理論是相當(dāng)普適的。因?yàn)樗偸峭ㄟ^不斷的抽象來提煉更加基本的概念。

用哲學(xué)的話說,便是從具體到抽象,從特殊到一般(例如兩個(gè)群,不論它們的元素多么地不同,只要運(yùn)算性質(zhì)相同,彼此就是同構(gòu)的,并且可以因此認(rèn)為是相同的代數(shù)對(duì)象而不加區(qū)別;不論膨脹、收縮、轉(zhuǎn)動(dòng)、反演…都可以統(tǒng)一起來,那就是指數(shù)函數(shù);不論弦振動(dòng)、聲音、流體、電磁波…都可以統(tǒng)一起來,它們?cè)跀?shù)學(xué)中都是雙曲型方程)。


每一次抽象都是一次“揚(yáng)棄”(留其精髓,去其平庸)的過程。

比如將“距離”概念抽象化而提煉出“單比”概念,進(jìn)一步將“單比”抽象化而提煉出“交比”概念,于是,從歐式幾何中舍棄“距離不變”而保留更普遍的“單比不變”,得到仿射幾何;從仿射幾何中舍棄“單比不變”而保留更普遍的“交比”,得到一般的射影幾何。

從歐式空間(長(zhǎng)度,夾角)到內(nèi)積空間(模,不嚴(yán)格的夾角)再到賦范空間(范,完全拋棄夾角)也是如此,不斷的改良(抽象、提煉),一改再改,但最終改到不能再改時(shí),就完成了一個(gè)革命——甚至連范數(shù)(最熟悉因而最不愿拋棄的度量或度規(guī))也拋棄了,從不嚴(yán)格的距離發(fā)展到不確定的距離(鄰域δ,就像前面提到的無窮小量一樣不確定),得到了里程碑式的“拓?fù)淇臻g”的概念——有史以來最廣泛最深刻的革命!

經(jīng)由歐式空間的連續(xù)函數(shù)抽象出度量空間的連續(xù)映射,一直到抽象出拓?fù)淇臻g中的同胚映射,在數(shù)學(xué)史上經(jīng)歷了很長(zhǎng)時(shí)間才完成。無獨(dú)有偶,物理學(xué)史也是如此。且不說從經(jīng)典力學(xué)到相對(duì)論、量子力學(xué)(這個(gè)過程想必大家都聽膩了),單說相對(duì)論本身也是如此。

Einstein說:“為什么從狹義相對(duì)論發(fā)表到廣義相對(duì)論建立又經(jīng)歷了7年那么長(zhǎng)時(shí)間?主要原因是,要擺脫坐標(biāo)必須有直接度量意義這個(gè)舊概念是不容易的”。

看來,物理學(xué)家和數(shù)學(xué)家都遇到了擺脫“度量”概念的困難,在擺脫舊概念走向新理論這一點(diǎn)上物理學(xué)界和數(shù)學(xué)界是相通的(數(shù)學(xué)界走向了拓?fù)鋵W(xué),物理學(xué)界走向了廣義相對(duì)論)。


關(guān)于作者: 陳光劍,江蘇東海人, 號(hào)行走江湖一劍客,字之劍。程序員,詩人, 作家

http://universsky.github.io/?


<link rel="stylesheet" >

<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>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容