国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

函數式編程的興衰與當前之崛起

binaryTree / 2193人閱讀

摘要:函數式編程逐漸被邊緣化,被拋棄到學術界和非主流的場外。組合式編程的重新崛起年左右,有個巨大的變化爆發了。人們開始逐漸在私下里談論函數式編程。箭頭函數對于函數式編程的爆發起到了推動劑的作用。現在很少看到那種不用函數式編程的大型應用了。

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

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

轉載請注明出處,保留原文鏈接以及作者信息

本文是“組合式軟件”系列的一篇文章,從頭開始學習函數式編程和使用 JavaScript ES6+ 進行軟件編程。請繼續關注,后面還有很多相關內容。

在我 6 歲的時候,我每天花很多時間和我最好的朋友一起打游戲,他們家里有很多電腦。對我來講它有種魔幻版不可抗拒的力量。有一天我突然問我朋友:“我們怎樣才能自己做一個游戲呢?”

他也不知道,所以我們一起去問他的爸爸,叔叔從很高的架子上拿下來一本書:Basic。我也由此開始了我的編程之旅。后來大學都有代數這門課程,而我對它已經很熟悉了,因為編程里面代數是基礎,到處都是代數。

組合式軟件的興起

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

阿隆佐·丘奇發明了 λ 演算, λ 演算是基于函數應用的通用計算模型。阿蘭·圖靈則因圖靈機而廣為人知。圖靈機定義了一個理論上的設備,它可以控制條帶上的符號。他們合作證明了 λ 演算和圖靈機是功能等價的。

λ 演算全部都是關于函數組合。函數組合在軟件開發中是非常富有表現力和說服力的。本文中,我們會討論函數組合在軟件設計中的重要性。

這里有三點關于 λ 演算的特殊說明:

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

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

函數是一級的。意思是說一個函數可以作為另一個函數的輸入,并且一個函數可以返回另一個函數。

這些特征一起構成了簡單且容易理解的規則,在組合式軟件中使用函數作為主要編碼單元。在 JavaScript 中,匿名函數和柯里化函數都是可選特征,也就是說 JavaScript 支持 λ 演算的主要特征但是并不強制使用。

經典的函數組合是把一個函數的輸出作為另一個函數的輸入,例如下面的組合:

    f·g

可以寫成:

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

下面是如何使用它:

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

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

首先傳遞 double 返回一個新函數 1;

新函數 1 以 inc 為參數并且返回一個新函數 2;

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

x=3 傳遞給 inc()

inc(3) 計算結果是 4;

double(4) 計算結果是 8

最終返回結果是 8

組合式軟件的過程可以用函數組合圖來表達,看下面代碼:

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

可以用圖來模擬表示:

λ 演算對軟件設計的影響是深遠的,直到大約 1980 年,計算機科學界很多有影響力的品牌,都是采用函數組合的方式來開發自己的軟件。Lisp 是 1958 年發明的,它深受 λ 演算的影響。直到今天,Lisp 是依舊廣為使用的第二大歷史悠久的語言。

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

Lisp 非常簡單,基本上可以在一天之內學習完它的基本語法和語義;

Lisp 基本上全部是函數組合,函數組合來做應用架構的方式非常優雅;

我所知道的最好的計算機科學課本使用Lisp:計算機程序的結構和解釋

組合式軟件的沒落

在 1970 到 1980 年期間,軟件開發的方式開始發生變化,簡單的組合式開發不再受寵。出現了面向對象編程,它基于組件封裝和信息傳遞的思想,在當時是非常先進的。代碼通過繼承來實現復用,繼承關系是一種叫做 is-a 的關系。

函數式編程逐漸被邊緣化,被拋棄到學術界和非主流的場外。在 1990?—?2010 年期間對三種人形成了甜蜜的困擾,一種是編程極客,一種是大學教授,一種是逃離了 Java 思想強制灌輸的幸運的學生。而對于我們來講,這 30 年的軟件開發有一點噩夢般的感覺,黑暗的年代。

組合式編程的重新崛起

2010 年左右,有個巨大的變化:JavaScript 爆發了。在 2006 年以前,JavaScript 一直被認為是一種玩具式的編程語言,可以在瀏覽器中做一些很可愛的動畫,但是在這背后隱藏著潛力巨大的特點,即 λ 演算的重要特征。人們開始逐漸在私下里談論“函數式編程”。

到 2015 年,用函數組合來開發軟件重新開始流行起來。為了簡化使用,JavaScript 規范也做了 10 年以來的首次重大升級,增加了箭頭函數。箭頭函數使創建和使用函數、柯里化和 λ 演算變得很容易。

箭頭函數對于 JavaScript 函數式編程的爆發起到了推動劑的作用。現在很少看到那種不用函數式編程的大型應用了。

組合的方式可以簡潔清晰地描述軟件的行為,把一些小的、確定性的函數組合成大的組件,進而形成軟件,這樣的軟件很容易組織、理解、調試、擴展、測試和維護。

在讀接下來文章的時候,希望你能通過例子自己動手做實驗。回想一下當自己還是的孩子的時候,把一些東西拆開,自己再學著組裝、拼接。重新找回童年探索事物的感覺,希望你能享受這個過程。

如果本文對你有幫助,歡迎關注我的專欄-前端大哈,定期發布高質量前端文章。

我最近正在寫一本《React.js 小書》,對 React.js 感興趣的童鞋,歡迎指點。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82455.html

相關文章

  • 90年代興衰——強化學習遞歸神經網絡

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

    rozbo 評論0 收藏0
  • 細數Python三十年技術演變史——萌發于小眾,崛起于AI

    摘要:作者宋天龍來源科技大本營導語一切都始于年的那個圣誕節,的誕生并不算恰逢其時,它崛起充滿了機遇巧合,也有其必然性。年的圣誕節,開始編寫語言的編譯器。年發布的標志著的框架基本確定。年月發布了系列的最后一個版本,主版本號為。 showImg(https://segmentfault.com/img/remote/1460000019862276); 作者 | 宋天龍來源 | AI科技大本營 ...

    tuniutech 評論0 收藏0
  • Javascript模塊化編程【模塊寫法】

    摘要:模塊化編程,已經成為一個迫切的需求。但是,不是一種模塊化編程語言,它不支持類,更遑論模塊了。本文總結了當前模塊化編程的最佳實踐,說明如何投入實用。就是模塊的基本寫法。這樣做除了保證模塊的獨立性,還使得模塊之間的依賴關系變得明顯。 隨著WEB的快速崛起,網頁越來越像桌面程序,需要一個團隊分工協作、進度管理、單元測試等等......開發者不得不使用軟件工程的方法,管理網頁的業務邏輯。 Ja...

    Riddler 評論0 收藏0
  • 前端每周清單半年盤點 JavaScript 篇

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

    Vixb 評論0 收藏0
  • 2017-09-30 前端日報

    摘要:前端日報精選劉海打理指北中的錯誤處理模式與反模式譯圖解和譯你并不知道中文裝飾器讓你的代碼更簡潔眾成翻譯第期每個程序員第一份工作前應該知道的件事中的不變性眾成翻譯寫的一次小結掘金內部機制探秘和文末附彩蛋和源碼前端雜談開發實戰 2017-09-30 前端日報 精選 iPhone X 劉海打理指北React16中的錯誤處理ES6 Promise:模式與反模式「譯」圖解 ArrayBuffer...

    darryrzhong 評論0 收藏0

發表評論

0條評論

binaryTree

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<