如果你花大量的時間閱讀互聯網上的編程趨勢,你就會聽說函數式編程。這個詞經常被提及,但它是什麼意思呢?
即使您知道什麼是函數式編程,您也可能不清楚哪些語言最適合它。畢竟,並非所有的編程語言都是平等的。雖然您可以在許多語言中應用函數式編程範例,但仍有一些地方您會感覺舒服得多。
如果你有數學背景,那麼你在函數式編程方面就有了先機。這是因為函數式編程範式將計算視為數學函數。如果你沒有數學背景,這會讓你感到困惑。
基本上,函數式編程將函數和數據視為不可變的。將數據傳遞到函數中,它通常會返回已轉換的數據或其他類型的數據。在函數式編程中,函數不應改變原始數據或程序狀態。
每個程序都應該做好一件事,這與Unix的理念有相似之處。函數不應該觸及程序的各個部分。相反,它應該接受它的輸入並給您一個輸出。
理想情況下,函數在函數編程中應該儘可能的純。這意味著給定相同的輸入,函數的輸出將始終保持不變。
這與面向對象編程有很大的不同。在面向對象編程中,通常有一個基本對象,它有各種方法專門用於更改作為該對象一部分的數據或狀態。如果沒有顯式聲明,方法甚至可以更改數據或狀態。
在實際程序中,有時這是有意義的。也就是說,它會使程序更難維護,因為並不總是清楚是什麼在改變狀態或數據。函數式編程最初用於學術環境,但也可以幫助防止此類問題。
一些編程語言允許函數式編程,而另一些語言則鼓勵甚至強制函數式編程。JavaScript屬於第一類。雖然您可以在語言中使用函數式編程範式,但也可以輕鬆地使用面向對象的方法。
也就是說,JavaScript中內置了很多函數式編程範例。以高階函數為例。這些函數可以將其他函數作為參數。
JavaScript有幾個與數組一起工作的函數,比如
map(),
reduce(),
filter(),以及其他,所有這些都是高階函數。這使您可以將它們鏈接在一起,以便使用數組快速執行各種操作。
雖然早期的JavaScript在可變性方面存在一些問題,但ECMAScript標準的較新版本提供了修復。而不是包羅萬象
var定義變量的關鍵字,現在
c***t和
let. 第一個允許您定義常量,顧名思義。第二次,
let,將變量的作用域限制為聲明它的函數。
與JavaScript一樣,Python是一種通用語言,您可以使用任意數量的編程範式。Python可能有它的缺點,但函數式編程不是其中之一。官方Python文檔中甚至有函數式編程的介紹。
首先,你會發現許多相同的
map(),
filter(),
reduce(),以及上述內置的類似功能。與JavaScript一樣,這些函數是高階函數,因為它們將其他函數作為參數。在Python中,函數式編程以
lambda關鍵字。
可以通過幾種方式使用lambda表達式。一種使用它的方法是作為簡單函數的速記。當賦值給變量時,可以像調用標準Python函數一樣調用lambda表達式。lambda表達式的真正優勢在於將它們用作匿名函數。
匿名函數也可以用JavaScript和此列表中的其他語言工作。當與高階函數一起使用時,它們特別方便,因為您可以當場定義它們。如果沒有匿名函數,就必須將即使是簡單的添加項也預先定義為定製函數。
與JavaScript和Python不同,Clojure可能不是家喻戶曉的名字,甚至在程序員中也是如此。如果您不熟悉的話,Clojure是Lisp編程語言的一種方言,可以追溯到20世紀50年代末,它帶來了一種非常特殊的方式來做事情,恰好非常適合函數式編程。
與其他Lisp方言一樣,Clojure將代碼視為數據。這意味著代碼可以有效地改變自身。與其他Lisp方言不同,Clojure運行在Java平臺上,並被編譯成JVM字節碼。這意味著它可以與Java庫一起工作,不管它們是否用Clojure編寫。
與此列表中以前的語言不同,Clojure是一種從頭開始的函數式編程語言。這意味著它儘可能地提倡不變性,特別是在數據結構中。
Clojure並不期望所有的程序在數學上都是“可證明的”,但鼓勵儘可能使用純函數。
Elm是這個列表中較新的語言之一,它是一種純函數式語言,最初由evanczaplicki在2012年設計。這種語言已經在web開發人員中流行起來,特別是在創建用戶界面方面。
與此列表中以前的每個條目不同,Elm使用靜態類型檢查。這有助於確保沒有運行時異常,而是在編譯時捕獲錯誤。這對用戶來說意味著更少的可見錯誤,這是一個主要的優點。
Elm編譯器以HTML、CSS和JavaScript為目標。與使用Clojure編寫在Java上運行的程序一樣,您也可以在Elm中編寫使用JavaScript庫的應用程序。
Elm和其他語言之間的一個主要區別是你不會找到泛型
filter(),
map(),以及類似的功能。相反,它們是由數據類型定義的,比如
List.map或
Dict.map.
Haskell是另一種靜態類型的純函數式語言。不像埃爾姆,哈斯克爾已經出現了一段時間。第一個版本的語言是在1990年設計的。最新的標準是Haskell 2010,而下一個版本計劃在2020年發佈。
正如我們已經探討過的,Haskell純粹的功能性意味著通過設計,功能不應該有副作用。這使得它非常適合解決現實世界中的問題,儘管函數式編程起源於學術界。
儘管Haskell缺乏主流的流行性,但它已經被廣泛應用於一些項目中。Xmonad窗口管理器完全是用Haskell編寫的。Pandoc也使用這種語言,它將不同類型的標記轉換成其他格式。
標準
map(),
filter(),
reduce(),以及其他高階函數,這些函數應該允許您將JavaScript或Python的概念引入Haskell。如果你想更多地瞭解這門語言,學習Haskell是一個受歡迎的起點。
如果你還不是一個經驗豐富的程序員,上面的一些術語和語言可能看起來有些深奧。這很好,因為知道你不知道的是成為一個更好的學習者的第一步。
上面列出的一些語言對初學者來說比其他語言更好。看看我們為初學者提供的最佳編程語言列表。你會注意到這兩個列表之間有些交叉。
如果您感興趣,請查看我們的指南,瞭解如何構建一個簡單的PHP網站。
...體管理是自動完成的。Swift是一種多正規化語言。它支援函數語言程式設計和麵向物件程式設計。 Swift有一些資料型別。最常用的資料型別是Int、Float、Double、Bool、String、Character、Optional、Tuples。可選資料型別可以包含值也可以...
關鍵區別–函數語言程式設計與指令式程式設計 函式式程式設計與命令式程式設計的關鍵區別在於,函式式程式設計將計算看作數學函式,避免了狀態和資料的變化,而命令式程式設計使用改變程式狀態的語句。 程式設計範...
...hon是反射的,因為程式可以在執行時更改結構。它還支援函數語言程式設計,即使用避免可變資料和共享狀態的函式來構建程式或軟體。 Python是一種基於直譯器的語言。與使用編譯器將原始碼轉換為目的碼的基於編譯器的語言...
...模式的現代程式語言。它是一種支援面向物件程式設計和函數語言程式設計的多正規化語言。 Swift有一些資料型別。最常用的資料型別是Int、Float、Double、Bool、String、Character、Optional、Tuples。可選資料型別可以包含值也可以不包...
... 這與你是否知道表情的正確含義無關。它是關於一些人用這種圖畫語言做的非同尋常的事情。從縮短連結到創作藝術,表情有一個奇妙的奇怪的一面,你需要看看。 ...
...,您需要了解程式碼是如何構建和執行的——也許您已經知道這一點了。本節將有相當一般性的陳述——適用於大多數語言,但不一定適用於所有語言。 ...
...來開始這個專案。我將在已經安裝了Python的Mac上執行。您應該能夠很好地使用Linux。如果您使用的是Windows,那麼您需要下載並安裝Python,也許還需要學習一下您的命令列技能。 ...
...時內,我就從一個新手發展到了中等水平。很多人可能都知道,HTML是一種標記語言,而不是程式語言。所以不幸的是,它不太符合標準。 ...
每個人都想成為一名軟體開發人員,但沒有人想成為一名軟體開發人員。存在的一個主要原因是:你是如何在腦子裡記住這些新名詞的? ...