成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

函數(shù)式編程的興衰與當(dāng)前之崛起

binaryTree / 2291人閱讀

摘要:函數(shù)式編程逐漸被邊緣化,被拋棄到學(xué)術(shù)界和非主流的場(chǎng)外。組合式編程的重新崛起年左右,有個(gè)巨大的變化爆發(fā)了。人們開(kāi)始逐漸在私下里談?wù)摵瘮?shù)式編程。箭頭函數(shù)對(duì)于函數(shù)式編程的爆發(fā)起到了推動(dòng)劑的作用?,F(xiàn)在很少看到那種不用函數(shù)式編程的大型應(yīng)用了。

本文作者: Eric Elliott
編譯:胡子大哈

翻譯原文:http://huziketang.com/blog/posts/detail?postId=58e3062ba58c240ae35bb8de
英文連接:The Rise and Fall and Rise of Functional Programming (Composing Software)

轉(zhuǎn)載請(qǐng)注明出處,保留原文鏈接以及作者信息

本文是“組合式軟件”系列的一篇文章,從頭開(kāi)始學(xué)習(xí)函數(shù)式編程和使用 JavaScript ES6+ 進(jìn)行軟件編程。請(qǐng)繼續(xù)關(guān)注,后面還有很多相關(guān)內(nèi)容。

在我 6 歲的時(shí)候,我每天花很多時(shí)間和我最好的朋友一起打游戲,他們家里有很多電腦。對(duì)我來(lái)講它有種魔幻版不可抗拒的力量。有一天我突然問(wèn)我朋友:“我們?cè)鯓硬拍茏约鹤鲆粋€(gè)游戲呢?”

他也不知道,所以我們一起去問(wèn)他的爸爸,叔叔從很高的架子上拿下來(lái)一本書(shū):Basic。我也由此開(kāi)始了我的編程之旅。后來(lái)大學(xué)都有代數(shù)這門(mén)課程,而我對(duì)它已經(jīng)很熟悉了,因?yàn)榫幊汤锩娲鷶?shù)是基礎(chǔ),到處都是代數(shù)。

組合式軟件的興起

在計(jì)算機(jī)科學(xué)剛剛起步的時(shí)候,很多計(jì)算機(jī)科學(xué)的理論都還沒(méi)有落地。那時(shí)候有兩個(gè)偉大的計(jì)算機(jī)科學(xué)家:阿隆佐·丘奇和阿蘭·圖靈。他們創(chuàng)造了兩個(gè)不同的,但是具有同等效力的通用計(jì)算模型。兩個(gè)模型都可以計(jì)算任何可以計(jì)算的東西(著重強(qiáng)調(diào),“通用”)。

阿隆佐·丘奇發(fā)明了 λ 演算, λ 演算是基于函數(shù)應(yīng)用的通用計(jì)算模型。阿蘭·圖靈則因圖靈機(jī)而廣為人知。圖靈機(jī)定義了一個(gè)理論上的設(shè)備,它可以控制條帶上的符號(hào)。他們合作證明了 λ 演算和圖靈機(jī)是功能等價(jià)的。

λ 演算全部都是關(guān)于函數(shù)組合。函數(shù)組合在軟件開(kāi)發(fā)中是非常富有表現(xiàn)力和說(shuō)服力的。本文中,我們會(huì)討論函數(shù)組合在軟件設(shè)計(jì)中的重要性。

這里有三點(diǎn)關(guān)于 λ 演算的特殊說(shuō)明:

函數(shù)通常是匿名的。在 JavaScript 中,const sum = (x, y) => x + y 的右邊是匿名函數(shù),即 (x, y) => x + y。

λ 演算中的函數(shù)只接受單一輸入,它是一元的。如果你需要傳遞多參數(shù),函數(shù)會(huì)接受第一個(gè)輸入并且返回一個(gè)新的函數(shù)來(lái)接受第二個(gè)參數(shù),以此類推。一個(gè) n 元函數(shù) (x, y) => x + y 可以表達(dá)為一個(gè)一元函數(shù):x => y => x + y。這種 n 元函數(shù)到一元函數(shù)的轉(zhuǎn)化叫做柯里化。

函數(shù)是一級(jí)的。意思是說(shuō)一個(gè)函數(shù)可以作為另一個(gè)函數(shù)的輸入,并且一個(gè)函數(shù)可以返回另一個(gè)函數(shù)。

這些特征一起構(gòu)成了簡(jiǎn)單且容易理解的規(guī)則,在組合式軟件中使用函數(shù)作為主要編碼單元。在 JavaScript 中,匿名函數(shù)和柯里化函數(shù)都是可選特征,也就是說(shuō) JavaScript 支持 λ 演算的主要特征但是并不強(qiáng)制使用。

經(jīng)典的函數(shù)組合是把一個(gè)函數(shù)的輸出作為另一個(gè)函數(shù)的輸入,例如下面的組合:

    f·g

可以寫(xiě)成:

    compose2 = f => g => x => f(g(x))

下面是如何使用它:

    double = n => n * 2
    inc = n => n + 1
    compose2(double)(inc)(3)

compose2() 函數(shù)接受 double 函數(shù)作為第一個(gè)參數(shù),inc 函數(shù)作為第二個(gè)參數(shù),最后應(yīng)用參數(shù) 3 到這兩個(gè)函數(shù)組合上。再看一下 compose2() 的聲明,fdouble()ginc(),x3。函數(shù)調(diào)用 compose2(double)(inc)(3),實(shí)際上是三個(gè)不同的函數(shù)調(diào)用:

首先傳遞 double 返回一個(gè)新函數(shù) 1;

新函數(shù) 1 以 inc 為參數(shù)并且返回一個(gè)新函數(shù) 2;

新函數(shù) 2 以 3 為參數(shù)并且計(jì)算 f(g(x)),即 double(inc(3));

x=3 傳遞給 inc();

inc(3) 計(jì)算結(jié)果是 4;

double(4) 計(jì)算結(jié)果是 8

最終返回結(jié)果是 8。

組合式軟件的過(guò)程可以用函數(shù)組合圖來(lái)表達(dá),看下面代碼:

    append = s1 => s2 => s1 + s2
    append("Hello, ")("world!")

可以用圖來(lái)模擬表示:

λ 演算對(duì)軟件設(shè)計(jì)的影響是深遠(yuǎn)的,直到大約 1980 年,計(jì)算機(jī)科學(xué)界很多有影響力的品牌,都是采用函數(shù)組合的方式來(lái)開(kāi)發(fā)自己的軟件。Lisp 是 1958 年發(fā)明的,它深受 λ 演算的影響。直到今天,Lisp 是依舊廣為使用的第二大歷史悠久的語(yǔ)言。

我是通過(guò) AutoLISP 知道的 Lisp,AutoLISP 是在最流行的電腦輔助設(shè)計(jì)(CAD)軟件——AutoCAD,中使用的腳本語(yǔ)言。AutoCAD 太流行了,使得其他所有的 CAD 應(yīng)用幾乎都支持 AutoLISP 以保持其兼容性。Lisp 依然能夠在計(jì)算機(jī)科學(xué)課程中廣為使用有三個(gè)主要原因:

Lisp 非常簡(jiǎn)單,基本上可以在一天之內(nèi)學(xué)習(xí)完它的基本語(yǔ)法和語(yǔ)義;

Lisp 基本上全部是函數(shù)組合,函數(shù)組合來(lái)做應(yīng)用架構(gòu)的方式非常優(yōu)雅;

我所知道的最好的計(jì)算機(jī)科學(xué)課本使用Lisp:計(jì)算機(jī)程序的結(jié)構(gòu)和解釋

組合式軟件的沒(méi)落

在 1970 到 1980 年期間,軟件開(kāi)發(fā)的方式開(kāi)始發(fā)生變化,簡(jiǎn)單的組合式開(kāi)發(fā)不再受寵。出現(xiàn)了面向?qū)ο缶幊?,它基于組件封裝和信息傳遞的思想,在當(dāng)時(shí)是非常先進(jìn)的。代碼通過(guò)繼承來(lái)實(shí)現(xiàn)復(fù)用,繼承關(guān)系是一種叫做 is-a 的關(guān)系。

函數(shù)式編程逐漸被邊緣化,被拋棄到學(xué)術(shù)界和非主流的場(chǎng)外。在 1990?—?2010 年期間對(duì)三種人形成了甜蜜的困擾,一種是編程極客,一種是大學(xué)教授,一種是逃離了 Java 思想強(qiáng)制灌輸?shù)男疫\(yùn)的學(xué)生。而對(duì)于我們來(lái)講,這 30 年的軟件開(kāi)發(fā)有一點(diǎn)噩夢(mèng)般的感覺(jué),黑暗的年代。

組合式編程的重新崛起

2010 年左右,有個(gè)巨大的變化:JavaScript 爆發(fā)了。在 2006 年以前,JavaScript 一直被認(rèn)為是一種玩具式的編程語(yǔ)言,可以在瀏覽器中做一些很可愛(ài)的動(dòng)畫(huà),但是在這背后隱藏著潛力巨大的特點(diǎn),即 λ 演算的重要特征。人們開(kāi)始逐漸在私下里談?wù)摗昂瘮?shù)式編程”。

到 2015 年,用函數(shù)組合來(lái)開(kāi)發(fā)軟件重新開(kāi)始流行起來(lái)。為了簡(jiǎn)化使用,JavaScript 規(guī)范也做了 10 年以來(lái)的首次重大升級(jí),增加了箭頭函數(shù)。箭頭函數(shù)使創(chuàng)建和使用函數(shù)、柯里化和 λ 演算變得很容易。

箭頭函數(shù)對(duì)于 JavaScript 函數(shù)式編程的爆發(fā)起到了推動(dòng)劑的作用?,F(xiàn)在很少看到那種不用函數(shù)式編程的大型應(yīng)用了。

組合的方式可以簡(jiǎn)潔清晰地描述軟件的行為,把一些小的、確定性的函數(shù)組合成大的組件,進(jìn)而形成軟件,這樣的軟件很容易組織、理解、調(diào)試、擴(kuò)展、測(cè)試和維護(hù)。

在讀接下來(lái)文章的時(shí)候,希望你能通過(guò)例子自己動(dòng)手做實(shí)驗(yàn)?;叵胍幌庐?dāng)自己還是的孩子的時(shí)候,把一些東西拆開(kāi),自己再學(xué)著組裝、拼接。重新找回童年探索事物的感覺(jué),希望你能享受這個(gè)過(guò)程。

如果本文對(duì)你有幫助,歡迎關(guān)注我的專欄-前端大哈,定期發(fā)布高質(zhì)量前端文章。

我最近正在寫(xiě)一本《React.js 小書(shū)》,對(duì) React.js 感興趣的童鞋,歡迎指點(diǎn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/82455.html

相關(guān)文章

  • 90年代興衰——強(qiáng)化學(xué)習(xí)遞歸神經(jīng)網(wǎng)絡(luò)

    摘要:強(qiáng)化學(xué)習(xí)這就是神經(jīng)網(wǎng)絡(luò)流行起來(lái)的地方。而且,我們也在這一范圍內(nèi)取得了強(qiáng)化學(xué)習(xí)史上最重要的成績(jī)之一一個(gè)學(xué)習(xí)并成為西洋雙陸棋玩家的神經(jīng)網(wǎng)絡(luò)。遞歸神經(jīng)網(wǎng)絡(luò)圖。 這是「神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)簡(jiǎn)史」的第三部分(第一部分,第二部分)。在這一部分,我們將繼續(xù)了解90年代研究的飛速發(fā)展,搞清楚神經(jīng)網(wǎng)絡(luò)在60年代末失去眾多青睞的原因。神經(jīng)網(wǎng)絡(luò)做決定神經(jīng)網(wǎng)絡(luò)運(yùn)用于無(wú)監(jiān)督學(xué)習(xí)的發(fā)現(xiàn)之旅結(jié)束后,讓我們也快速了解一下它們...

    rozbo 評(píng)論0 收藏0
  • 細(xì)數(shù)Python三十年技術(shù)演變史——萌發(fā)于小眾,崛起于AI

    摘要:作者宋天龍來(lái)源科技大本營(yíng)導(dǎo)語(yǔ)一切都始于年的那個(gè)圣誕節(jié),的誕生并不算恰逢其時(shí),它崛起充滿了機(jī)遇巧合,也有其必然性。年的圣誕節(jié),開(kāi)始編寫(xiě)語(yǔ)言的編譯器。年發(fā)布的標(biāo)志著的框架基本確定。年月發(fā)布了系列的最后一個(gè)版本,主版本號(hào)為。 showImg(https://segmentfault.com/img/remote/1460000019862276); 作者 | 宋天龍來(lái)源 | AI科技大本營(yíng) ...

    tuniutech 評(píng)論0 收藏0
  • Javascript模塊化編程【模塊寫(xiě)法】

    摘要:模塊化編程,已經(jīng)成為一個(gè)迫切的需求。但是,不是一種模塊化編程語(yǔ)言,它不支持類,更遑論模塊了。本文總結(jié)了當(dāng)前模塊化編程的最佳實(shí)踐,說(shuō)明如何投入實(shí)用。就是模塊的基本寫(xiě)法。這樣做除了保證模塊的獨(dú)立性,還使得模塊之間的依賴關(guān)系變得明顯。 隨著WEB的快速崛起,網(wǎng)頁(yè)越來(lái)越像桌面程序,需要一個(gè)團(tuán)隊(duì)分工協(xié)作、進(jìn)度管理、單元測(cè)試等等......開(kāi)發(fā)者不得不使用軟件工程的方法,管理網(wǎng)頁(yè)的業(yè)務(wù)邏輯。 Ja...

    Riddler 評(píng)論0 收藏0
  • 前端每周清單半年盤(pán)點(diǎn) JavaScript 篇

    摘要:前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn)分為新聞熱點(diǎn)開(kāi)發(fā)教程工程實(shí)踐深度閱讀開(kāi)源項(xiàng)目巔峰人生等欄目。背后的故事本文是對(duì)于年之間世界發(fā)生的大事件的詳細(xì)介紹,闡述了從提出到角力到流產(chǎn)的前世今生。 前端每周清單專注前端領(lǐng)域內(nèi)容,以對(duì)外文資料的搜集為主,幫助開(kāi)發(fā)者了解一周前端熱點(diǎn);分為新聞熱點(diǎn)、開(kāi)發(fā)教程、工程實(shí)踐、深度閱讀、開(kāi)源項(xiàng)目、巔峰人生等欄目。歡迎...

    Vixb 評(píng)論0 收藏0
  • 2017-09-30 前端日?qǐng)?bào)

    摘要:前端日?qǐng)?bào)精選劉海打理指北中的錯(cuò)誤處理模式與反模式譯圖解和譯你并不知道中文裝飾器讓你的代碼更簡(jiǎn)潔眾成翻譯第期每個(gè)程序員第一份工作前應(yīng)該知道的件事中的不變性眾成翻譯寫(xiě)的一次小結(jié)掘金內(nèi)部機(jī)制探秘和文末附彩蛋和源碼前端雜談開(kāi)發(fā)實(shí)戰(zhàn) 2017-09-30 前端日?qǐng)?bào) 精選 iPhone X 劉海打理指北React16中的錯(cuò)誤處理ES6 Promise:模式與反模式「譯」圖解 ArrayBuffer...

    darryrzhong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<