導航:首頁 > 編程語言 > 函數式編程

函數式編程

發布時間:2022-01-16 02:45:08

❶ js 什麼是函數式編程

寫一個函數(即方法:function),然後去調用這個方法、比如寫個C的helloworld然後調用printf就是函數式(過程化)編程,

補充:javaScript一種直譯式腳本語言,是一種動態類型、弱類型、基於原型的語言,內置支持類型。它的解釋器被稱為JavaScript引擎,為瀏覽器的一部分,廣泛用於客戶端的腳本語言,最早是在HTML(標准通用標記語言下的一個應用)網頁上使用,用來給HTML網頁增加動態功能。

在1995年時,由Netscape公司的Brendan Eich,在網景導航者瀏覽器上首次設計實現而成。因為Netscape與Sun合作,Netscape管理層希望它外觀看起來像Java,因此取名為JavaScript。但實際上它的語法風格與Self及Scheme較為接近。

❷ 式編程,命令式編程()和函數式編程的區別

編程語言主要有四種類型

❸ 學習函數式編程有什麼用

函數式編程是種編程範式,它將電腦運算視為函數的計算。函數編程語言最重要的基礎是λ演算(lambdacalculus)。而且λ演算的函數可以接受函數當作輸入(參數)和輸出(返回值)。和指令式編程相比,函數式編程強調函數的計算比指令的執行重要。和過程化編程相比,函數式編程里,函數的計算可隨時調用。

❹ 學習函數式編程的推薦書籍

1、關於書籍的選擇

1)、選擇好學習的函數式編程語言後,可以根據自己的情況去一些書店、網上商城(比京東、當當)選擇相應編程語言的書籍資料。

2)、如果從思想入手,並且希望學的更深入,個人建議從SICP(《計算機程序的構造和解釋》)入手,Scheme語言是思想的錘煉。
3)、如果用戶是java程序員,建議看看clojure,這是個極具生產力的語言工具,它運行於java平台上的lisp。twitter的storm就是用它寫的。clojure現在已經是黑客領域最耀眼的明星了。最重要的是clojure已經出版了很多本中文教材,可以入手學習了。順帶加上SICP可以加快學習進度。以項目為中心可以選擇《Clojure經典實例 功能性編程全面指南》、沒有基礎的可以選擇《LivingClojure》(中文版)、老程序員可以參考《Clojure編程樂趣》中文版 。

4)、如果不為作項目,只是為了提升個人的能力或者編程思想,可以選擇haskell語言,這個資料也比較多,無論書籍還是視頻、文檔等等 。


2、簡單說,"函數式編程"是一種"編程範式"(programming paradigm),也就是如何編寫程序的方法論。


它屬於"結構化編程"的一種,主要思想是把運算過程盡量寫成一系列嵌套的函數調用。舉例來說,現在有這樣一個數學表達式:

(1+2)*3-4

傳統的過程式編程,可能這樣寫:

vara=1+2;
varb=a*3;
varc=b-4;

函數式編程要求使用函數,我們可以把運算過程定義為不同的函數,然後寫成下面這樣:

varresult=subtract(multiply(add(1,2),3),4);

這就是函數式編程。


3、函數編程的特點:

函數式編程具有五個鮮明的特點。

1)、 函數是"第一等公民"

所謂"第一等公民"(first class),指的是函數與其他數據類型一樣,處於平等地位,可以賦值給其他變數,也可以作為參數,傳入另一個函數,或者作為別的函數的返回值。

舉例來說,下面代碼中的print變數就是一個函數,可以作為另一個函數的參數。

varprint=function(i){console.log(i);};
[1,2,3].forEach(print);

2)、只用"表達式",不用"語句"

"表達式"(expression)是一個單純的運算過程,總是有返回值;"語句"(statement)是執行某種操作,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,而且都有返回值。

原因是函數式編程的開發動機,一開始就是為了處理運算(computation),不考慮系統的讀寫(I/O)。"語句"屬於對系統的讀寫操作,所以就被排斥在外。

當然,實際應用中,不做I/O是不可能的。因此,編程過程中,函數式編程只要求把I/O限制到最小,不要有不必要的讀寫行為,保持計算過程的單純性。

3)、沒有"副作用"

所謂"副作用"(side effect),指的是函數內部與外部互動(最典型的情況,就是修改全局變數的值),產生運算以外的其他結果。

函數式編程強調沒有"副作用",意味著函數要保持獨立,所有功能就是返回一個新的值,沒有其他行為,尤其是不得修改外部變數的值。

4)、不修改狀態

上一點已經提到,函數式編程只是返回新的值,不修改系統變數。因此,不修改變數,也是它的一個重要特點。

在其他類型的語言中,變數往往用來保存"狀態"(state)。不修改變數,意味著狀態不能保存在變數中。函數式編程使用參數保存狀態,最好的例子就是遞歸。下面的代碼是一個將字元串逆序排列的函數,它演示了不同的參數如何決定了運算所處的"狀態"。

functionreverse(string){
if(string.length==0){
returnstring;
}else{
returnreverse(string.substring(1,string.length))+string.substring(0,1);
}
}

由於使用了遞歸,函數式語言的運行速度比較慢,這是它長期不能在業界推廣的主要原因。

5)、引用透明

引用透明(Referential transparency),指的是函數的運行不依賴於外部變數或"狀態",只依賴於輸入的參數,任何時候只要參數相同,引用函數所得到的返回值總是相同的。

有了前面的第三點和第四點,這點是很顯然的。其他類型的語言,函數的返回值往往與系統狀態有關,不同的狀態之下,返回值是不一樣的。這就叫"引用不透明",很不利於觀察和理解程序的行為。

❺ 函數式編程有什麼弊端

不論是面向對象編程還是函數式編程,如果你走了極端,那都是錯誤的。面向對象編程的極端是一切都是對象(純面向對象)。函數式編程的極端是純函數式編程語言。
面向對象編程的問題
面向對象的問題在於它對「對象」的定義,它試圖將所有事情就納入到這個概念里。這種做法極端化後,你就得出來一個一切皆為對象思想。
但這種思想是錯誤的,因為有些東西不是對象。函數就不是對象。

❻ 為什麼說面向對象編程和函數式編程

先從結構化編程說起

很久以前,軟體開發的世界還是一片渾渾噩噩,不管開發什麼軟體都面臨著復雜性這個問題,代碼裡面到處是goto語句,程序的流程隨意跳轉。眾生寫代碼時,越寫到後面越不知道自己寫的是什麼。這時候出現一位巨人,它就是結構化編程。

結構化編程的基本思想是:

有序地控制流程,即把程序的執行順序限制為順序、分支和循環這三種;
把共通的處理歸結為常式(函數)。
結構化編程的好處是:

三大限制:大大降低了程序的自由度,減少了各種組合,使得程序不至於太過復雜。對於這一點,結構化編程的順序、分支和循環可以實現一切演算法,雖然降低了程序的復雜性和靈活性,但是程序的實現能力並沒有降低。
常式(函數):我們只需要知道過程(函數)的名字,而不需要知道過程的內部細節,即「黑盒化」。
雖然結構化解決了程序控制流的復雜問題,但程序裡面不僅包括控制結構,還包括要處理的數據。隨著處理數據的增加,程序的復雜性也會上升。這時候,面向對象編程來了!

面向對象的由來

「分別管理程序處理內容和處理數據對象所帶來的復雜性」問題是,為了得到正確的結果,必須保持處理和數據的一致性,這在結構化編程中是非常困難的,解決這一問題的方案就是數據抽象技術。

數據抽象是數據和處理方法的結合。這便是最初「對象」一詞的得來。面向對象編程也因此得名。

然後,從抽象原則來說,多個相同事物出現時,應該組合在一起,即DRY原則(Don't Repeat Yourself),便又引出了類這一概念。

根據數據類型來進行合適的處理(調用合適的方法),本來就應該是編程語言這種工具應該完成的事。這便是多態的引出了。

而對於繼承,大部分的觀點是「繼承是隨著程序的結構化和抽象化自然進化而來的一種方式」。結構化和抽象化,意味著把共通部分提取出來生成父類的自底向上的方法。(如果繼承是這樣誕生的話,那麼最初,有多個父類的多重繼承就會成為主流,而實際上最初引入繼承的Simula語言只提供單一繼承。松本行弘認為繼承的原本目的實際是逐步細化)

❼ 函數式編程的特性

在經常被引用的論文 「Why Functional Programming Matters」(請參閱 參考資料) 中,作者 John Hughes 說明了模塊化是成功編程的關鍵,而函數編程可以極大地改進模塊化。在函數編程中,編程人員有一個天然框架用來開發更小的、更簡單的和更一般化的模塊, 然後將它們組合在一起。函數編程的一些基本特點包括:
支持閉包和高階函數,支持惰性計算(lazy evaluation)。使用遞歸作為控制流程的機制。加強了引用透明性。沒有副作用。我將重點放在在 Java 語言中使用閉包和高階函數上,但是首先對上面列出的所有特點做一個概述。 副作用是修改系統狀態的語言結構。因為 FP 語言不包含任何賦值語句,變數值一旦被指派就永遠不會改變。而且,調用函數只會計算出結果 ── 不會出現其他效果。因此,FP 語言沒有副作用 。

❽ 什麼是函數式編程

在維基網路中,已經對函數式編程有了很詳細的介紹。
那我們就來摘取一下Wiki上對Functional Programming的定義:
In
computer science, functional programming is a programming paradigm that
treats computation as the evaluation of mathematical functions and
avoids state and mutable data.
簡單地翻譯一下,也就是說函數式編程是一種編程模型,他將計算機運算看做是數學中函數的計算,並且避免了狀態以及變數的概念。

❾ 什麼是函數式編程思維

1.表達式化

最初的時候,需要轉變觀念,去可變數,去循環,把命令式改成表達式,注意,這只是把你丟在荒山野嶺讓你感受一下,離開熟悉的環境,地球依然在轉,但是有個
重點,那就是一切都是表達式; 為什麼是表達式呢?這個問題就像為什麼魚在水裡?
因為函數式建立在lambda演算之上而非圖靈機,只不過兩者被證明等價,所以你可以在你的機器上跑全是表達式的代碼,就如有人證明天空適合魚生存,所以
魚可以在天上游
當你接受了魚可以在天上游之後,就該上正餐了

1.5 數據與行為分離
這也是和面向對象不一致的地方,面向對象強調數據與行為綁定,但函數式不是,確切的說函數式 函數與數據等價,所以你才可以將函數當參數與返回值,你在設計時,切勿讓數據自己長腿能跑,其次,行為必須消除副作用,不可以偷偷把數據改了,習慣第一條後,應該不會的

2.高階邏輯

了函數式,就不要在想循環,賦值這些低階邏輯了,而應該更高階的思考問題,這比轉化表達式更難,函數式又叫聲明式,也就是你要做什麼,只要說一下就行,而
非寫個遍歷,做個狀態判斷,用函數式你不需要考慮這些,你不知道函數式的列表是怎麼遍歷的,中間向兩邊?
從後往前?這也是為何函數式適合並發的原因之一,你想知道列表中大於3的數有多少,只要,list.count(_ > 3)
而不是寫循環,你可以直接寫你的業務,不要拘泥於細節,有點像sql, 你需要什麼告訴電腦就行,你或許會問,count foreach filter
這些函數怎麼來的? 因為有了他們你才不需要寫循環,他們把你留在高階邏輯中,這個問題的答案請看下面

3.組合子邏輯 或又叫 自底向上的設計

數式和OO是反的,面向對象是自頂向下的設計,函數式是自底向上的設計,也就是先定義最基本的操作,然後不斷組合,不斷堆積以滿足你的所有需要,如sql
定義了select, from, where...這幾個組合子,來滿足你的查詢需求,同理函數式語言會提供foreach,
map等組合子(操作)來滿足你的需求,所以你必須自下而上的設計你的代碼結構,並且滿足你的需求,當你只用組合子寫代碼時,你會發現你寫的全是高階邏輯

果這些已有組合子滿足不了你,你就得自己寫,foreach不行,你就自己寫遞歸,我告訴你,遞歸背後也是組合子,這里一些'大神'應該不知道,在圖靈機
里,遞歸就是方法不斷調用自己沒什麼好說的,但是在lambda演算中,匿名函數是沒法調用自己的,所以遞歸是用Y組合子(又叫不動點組合子)把遞歸函數
自己求解出來再調用的,這才可以實現遞歸,並與圖靈機的循環等價,有點跑題了,總之要想順手的寫函數式,最好用面向組合子的設計,注意,不是必須,組合子
演算和lambda演算可以相互轉化,也就是,你完全可以寫一堆雜亂的表達式,但沒有組合子邏輯來得清爽,Haskell大規模使用monad這個特殊組
合子,始其變得統一整潔

好了,總結一下
函數式思維,其實就是組合子邏輯,用簡單的幾個函數組合來構建復雜邏輯,始終以高階的角度去表達問題,而非依賴副作用。
知道這點,你用java也可以寫函數式代碼了

❿ 函數式編程和響應式編程有什麼區別

1. 我暫且認為你說的RP是指Rx*框架的Reactive programming,(如果不是,就先認為是一下吧)
Rx*框架的RP,其實應該叫FRP(Functional Reactive Programming)(誤,感謝 邵成的指正,具體見補充部分),那和FP基本上就是一種派生(derive)關系了
FRP基本上就是面向非同步事件流的編程了,這個非同步事件流叫:Observable,一般叫:Stream

Stream就是一個 按時間排序的Events(Ongoing events ordered in time)序列
Stream是不可變(Immutability)的,任何操作都返回新的Stream, 且它是一個Monad(它有map和flatMap方法)。
FRP的關注點在Stream,而FP的關注點在(Type, Operate),Stream -> (Type, Operate)是一種泛化(generic),(Type, Operate) -> Stream 是一種派生。
RP本身是建立於觀察者模式之上的一種編程範式(級別同MV*),FP則更偏向底層解決一般化問題。

閱讀全文

與函數式編程相關的資料

熱點內容
手機時間如何校正到伺服器 瀏覽:81
創造與魔法瞬移源碼百度 瀏覽:882
反射優化java 瀏覽:874
硬體加密播放盒子 瀏覽:923
xp點擊文件夾選項沒反應 瀏覽:537
蘋果不顯示桌面的app怎麼刪除 瀏覽:864
安卓手機怎麼換國際服 瀏覽:415
神獸領域安卓怎麼下載 瀏覽:250
單片機交通燈ad原理圖 瀏覽:413
多功能解壓磁鐵筆 瀏覽:80
少兒編程火箭升空 瀏覽:401
蘭斯10游戲解壓碼 瀏覽:42
手機proxy伺服器地址 瀏覽:449
吉他清音壓縮 瀏覽:301
簡歷模板程序員 瀏覽:882
螺桿壓縮機虛標型號 瀏覽:953
idea開發項目伺服器ip地址 瀏覽:125
串口伺服器出現亂碼怎麼解決 瀏覽:950
命令按鈕的default 瀏覽:161
戰網如何登錄其他伺服器 瀏覽:990