函數式編程,我心中的 C 位!

2020-12-11 CSDN

實際上,大多數軟體工程師對於函數式編程的概念並不太熟悉。

作者 | Emmett Boudreau

譯者 | 彎月,責編 | Elle

以下為譯文:

編程範式指的是編寫命令的方法。程式語言的思想正是建立在其編程範式之上。最常見的三種範式分別是面向對象程序設計、命令式程序設計和函數式程序設計。這三種思想體系並無優劣之分,通常我們都需要選擇正確的工具來完成工作。

大多數軟體工程師對於函數式編程的概念並不太熟悉。實際上,歷史上的第二個程式語言Lisp就屬於函數式範式。函數式編程簡化了編程的定義,傳統編程非常注重修改存儲在類構造函數中的對象,而函數式編程則優先考慮數據的不變性和數學計算。在現代函數式編程中,這種思想有點冗長,但這不一定是一件壞事。函數式程式語言的可變性非常實用,我敢說函數式編程非常實用。

如此說來,函數式編程不限於函數式語言。例如,Python 也擁有函數式特性。儘管現代函數式編程已與傳統的函數式大相逕庭,但是似乎大多數用於數據科學的語言都採用了函數式和面向對象的範式。

很適合我們當前的工作

大多數函數式程式語言的標題均帶有「統計」字樣。這很方便,因為數據科學家與統計學家很相像,只是他們還掌握了編程和機器學習的技術。函數式程式語言的速度很快,而且最重要的是,對數據科學家而言,函數式程式語言更容易使用。

沒人喜歡瀏覽C代碼,因為C的可讀性不太好。而大多數函數式程式語言都具有可讀性,而且很容易輸入和上手。你甚至不會想到,網際網路上許多早期的大數據流水線使用的都是函數式編程。實際上,隨著機器學習和統計計算的興起,函數式編程也越來越流行了。

了不起的語言

我們有很多了不起的統計語言,其中許多語言能夠將自己的特徵和其他傳統的特徵融合在一起。我喜歡很多函數式程式語言。

Julia

Julia 一直都是我最喜歡的程式語言。雖然 Julia 是實打實的函數式程式語言,但它還包含一些可變和類似於對象的屬性,因此十分方便編寫程序。作為一種高級語言,Julia 的速度非常快。它的類型聲明很容易,而且如果有了恰當的類型定義,它可以與 C 一樣快,同時比 R 和 Scala 易於閱讀。通常,你不需要花費太多時間就可以用 Julia 建立模型並進行訓練,而且由於語言簡單易用,機器學習的速度很快,因此使用 Julia 擁有很大優勢。在某些情況下,例如使用我的機器學習軟體包 Lathe 時,只需很少的代碼就可以完成機器學習,而且可以通過參數多態性輕鬆地修改構造函數的屬性。

Lisp

儘管 Lisp 在數據科學領域名不見經傳,但它仍然是一種非常酷的語言。Lisp 和 Julia 一樣,是一種非常方便使用的程式語言。值得一提的屬性之一是 Lisp 的宏和 Julia 的宏。宏本身是重要的函數式特徵,如果使用得當,在 notebook 中編寫代碼就會非常容易。應該注意的是,Lisp 本身還可以分成一系列語言,包括Scheme,Clojure 和(通用)Lisp。作為歷史上的第二個高級程式語言,我們很難估計 Lisp 及其功能的影響,但我敢說影響範圍肯定很深遠。

R語言

下面讓我們來談一談老朋友 R。從傳統意義來看,R語言是一種函數式程式語言,但是與大多數其他語言一樣,R語言也屬於多範式,這意味著它可以從各個編程範式中進行選擇。這是一種優勢,因為R語言可以利用可變性。R語言源自S語言,並且一直專注於統計計算。

Haskell

Haskell 與我上面所說的多範式語言完全不同,它是純粹的函數式程式語言。與本文提及的其他語言不同,我從未使用過 Haskell,因此沒有太多發表權。但據我所知,Haskell 是一種相當了不起的語言。我對 Haskell 的了解很局限。如上所述,大多數現代語言都是多範式的,因此它們可以更有效地消滅bug,同時又無需創建新的代碼庫。

總結

在工作中,我最常用的都是函數式程式語言,主要是Julia,而GitHub代碼庫主要保存的也是 Julia notebook。我喜歡函數式編程,因為它非常適合我當前的工作。當然,有時候用 Python 的構造函數(類)來處理某個特定的工作可能會更好,但是總的來說,Julia 也可以勝任,而且我覺得用 Julia 編程非常流暢且高效。對於有些人來說,可能函數式程式語言無法完成他們的目標,而且對於一生都在使用面向對象語言的人來說,可能學習函數式編程語的難度很大。歸根結底,語言只是一種選擇,大多數語言都有一批忠實的擁護者,而且大多數語言都有優點和缺點。

原文:https://towardsdatascience.com/functional-programming-is-awesome-c94bcd150ae6

本文為 CSDN 翻譯,轉載請註明來源出處。

【End】

相關焦點

  • Golang 函數式編程簡述
    什麼是 Functional Programming 首先我們需要研究一下什麼是高階函數編程?所謂的 Functional Programming,一般被譯作函數式編程(以 λ演算 為根基)。函數式編程,是指忽略(通常是不允許)可變數據(以避免它處可改變的數據引發的邊際效應),忽略程序執行狀態(不允許隱式的、隱藏的、不可見的狀態),通過函數作為入參,函數作為返回值的方式進行計算,通過不斷的推進(迭代、遞歸)這種計算,從而從輸入得到輸出的編程範式。在函數式編程範式中,沒有過程式編程所常見的概念:語句,過程控制(條件,循環等等)。
  • 【第1679其】函數式編程淺析
    正文從這開始~~之前的我模糊的知道,函數式編程(下文簡稱 FP) 「簡潔」、「數學」、「優雅」,但是仔細一想,我並不理解這些詞具體的含義。當我看到別人號稱是 FP 風格的代碼時,會覺得晦澀難懂。這其實就是問題所在,一個大家都覺得好的東西,我竟然不理解。
  • 函數式編程
    ,我們會看到如下函數式編程的長相:函數式編程的三大特性:immutable data 不可變數據:像Clojure一樣,默認上變量是不可變的,如果你要改變變量,你需要把變量copy出去修改。函數式編程的幾個技術map & reduce :這個技術不用多說了,函數式編程最常見的技術就是對一個集合做Map和Reduce操作。這比起過程式的語言來說,在代碼上要更容易閱讀。
  • 函數式編程聖經
    上帝看到約翰·麥卡錫發明了表處理語言 Lisp,卻只用來學術研究,很是傷心,就把 Lisp 解釋器的秘密告訴了他的學生史蒂芬·羅素,史蒂芬·羅素將eval函數在IBM 704機器上實現後,函數式編程的大門第一次向人類打開了。
  • 函數式編程,真香
    最開始接觸函數式編程的時候是在小米工作的時候,那個時候看老大以前寫的代碼各種 compose,然後一些 ramda 的一些工具函數,看著很吃力,然後極力吐槽函數式編程,現在回想起來,那個時候的自己真的是見識短淺,只想說,'真香'。
  • Python(27)常用指引:函數式編程指引
    函數式編程指引本文檔提供恰當的 Python 函數式編程範例,在函數式編程簡單的介紹之後,將簡單介紹Python中關於函數式編程的特性如 iterator
  • 高階函數與函數式編程
    根據程式語言理論,一等對象必須滿足以下條件:Python 函數同時滿足這幾個條件,因而也被稱為 一等函數 。高階函數 則是指那些以函數為參數,或者將函數作為結果返回的函數。對高階函數稍加利用,便能玩出很多花樣來。本節從一些典型的案例入手,講解 Python 函數高級用法。
  • 白話 Python 的函數式編程
    今天和大家聊聊 Python 的函數式編程特性。
  • Python中的函數式編程
    (英語:functional programming)或稱函數程序設計,又稱泛函編程,是一種編程範型,它將電腦運算視為數學上的函數計算,並且避免使用程序狀態以及易變對象。函數程式語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(引數)和輸出(傳出值)。
  • 為什麼函數式編程在Java中很危險?
    在我的日常工作中,我身邊的開發者大多是畢業於CS編程頂級院校比如MIT、CMU以及Chicago,他們初次涉及的語言是Haskell、Scheme及Lisp。他們認為函數式編程是一種自然的、直觀的、美麗的且高效的編程樣式。
  • Java如何支持函數式編程?
    Java 8開始,引入了函數式編程接口與Lambda表達式,便於開發者寫出更少更優雅的代碼。什麼是函數式編程?函數式編程的特點是什麼?本文通過代碼實例,從Stream類、Lambda表達式和函數接口這三個語法概念來分享Java對函數式編程的支持。文末福利:Java微服務沙箱體驗挑戰。
  • C語言編程核心要點
    雖然C有抽象不足的缺點,但我更喜歡它的精巧,只需要花少量的時間,研究清楚它每一個知識點,看任何C源碼就不會存在語法上的障礙,大家需要建立的知識共識足夠少,少即是多,少好於多。我教過6個人編程,教過HTML,教過JAVA,也教過C++。最近,我在教我小孩編程,他只有十歲,很多人建議我選擇Python,但我最終選擇了C,因為C簡單且強大,現在看來,好像是個不錯的選擇。
  • 大前端進擊之路(一):函數式編程
    函數式編程概念一、什麼是函數式編程函數式編程(Functional Programming, FP),是一種編程風格,也可以認為是一種思維模式,和面向過程、面向對象是並列的關係。函數式編程是對運算過程的抽象,函數指的並不是程序中的函數或者方法,而是數學中的函數映射關係,例如:y=cos(x),是y和x的關係。
  • C/C++編程筆記:C/C++中的strrchr()函數,到底該怎麼用?
    此函數返回一個指針,該指針指向字符串中最後一次出現的字符。 我們想要找到的最後一個出現的字符作為函數的第二個參數傳遞,而我們必須在其中找到該字符的字符串作為函數的第一個參數傳遞。 句法char * strrchr(const char * str,int c)在這裡,str是字符串,c是要定位的字符。它作為int促銷傳遞,但在內部轉換回char。 運用給定C ++中的字符串,我們需要查找字符的最後一次出現,假設為「 a」。
  • Kotlin函數式編程
    那麼在函數式編程中當然一切皆是函數。在Kotlin中函數式的地位和對象一樣高,你可以在方法中輸入函數,也可以返回函數。函數式編程FP特徵:函數式編程核心概念:函數是「一等公民」:是指函數與其他數據類型是一樣的,處於平等地位。函數可以作為其他函數的參數傳入,也可以作為其他函數的返回值返回。
  • 大數據入門:Scala函數式編程
    提到Scala,首先會提到的一個概念,就是函數式編程,這也是Scala語言區別與其他程式語言的典型特徵。Scala是一門多範式(multi-paradigm)的程式語言,設計初衷是要集成面向對象編程和函數式編程的各種特性。
  • 給JavaScript 開發者講講函數式編程 - OSCHINA - 中文開源技術...
    於我而言,可能只是一個流行詞罷了。從那時起,我開始更深地了解函數式編程並且我覺得應該為那些總能聽到它但不知道究竟是什麼的新人做一點事情。儘管它們都是函數式語言,不過的確有很大的不同,可以說各有各的賣點。在文章的結尾處,我希望你能夠對這些有一個更加清晰的認識。它們都在某些更加現代的語言上留下了自己的影子。你可能聽說過這樣兩種語言:Elm 和 Clojurescript,它們兩個都可以編譯為 JavaScript。不過在我深入了解語言的規範之前,我更想讓你們深入了解函數式語言中的一些核心概念和模式。
  • 函數式編程中的副作用概念
    前言為了清楚起見,請記住,副作用不是必需的壞事,有時副作用是有用的(尤其是在函數式編程範式之外)。今天聊一聊函數式編程中的隔離思想,它所想隔離的就是「副作用」我們先從其他角度來聊一聊副作用這個概念。函數式編程中的副作用概念如果函數有副作用,我們將其稱為過程函數式編程是基於沒有副作用的這樣一個簡單的前提。在這種範例中,副作用是被排斥的。如果函數有副作用,我們將其稱為過程,或者命令式。因此函數沒有副作用。
  • 10分鐘學會python函數式編程
    一旦你設置了一個變量,它就永遠保持這種狀態(注意,在純函數式語言中,它們不是變量)。因此,函數式編程沒有副作用。副作用指的是函數改變它自己以外的東西。讓我們看一些典型Python代碼的示例:開頭我說過純函數式程式語言沒有變量。更高階的函數使這變得更容易。Python中的所有函數都是一等公民。
  • java8的函數式編程解析
    其實在java8就已經有java的函數式編程寫法,只是難度較大,大家都習慣了對象式用法,但在其它語言中都有函數式的用法,如js,scala,函數式其實是抽象到極致的思想。什麼是函數式編程 函數式編程並不是Java新提出的概念,其與指令編程相比,強調函數的計算比指令的計算更重要;與過程化編程相比,其中函數的計算可以隨時調用。