原創|行業資訊|編輯:龔雪|2015-01-06 09:49:02.000|閱讀 454 次
概述:函數式編程應該是你2015年的最優先選擇:2015年是Functional Programming(函數式編程應)重生之后的重要一年。被遺忘60年后,現在,他又流行起來。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
你可能聽過 "Clojure", "Scala", "Erlang" or even "Java now has lambdas"這些詞語。你也可能知道這些詞語"函數式編程"有關。如果你有逛編程論壇,那么這個東西,你應該經常見到。
如果Google搜索" Functional Programming",你找不到什么新東西。曾經第二大語言擁抱他,出現在上世紀50你年代,被命名為Lisp。那么,為什么現在才流行呢?
信不信由你,以前電腦比DOM運行還慢好多。在那個時候,主要有兩種設計習慣和編程語言:
那時候的電腦沒辦法處理抽象對象求函數程序值。因此,由于不適合工作,Lisp以慢慢死亡收場。然后,命令式編程開始了它的統治,特別是C的崛起。
現在,電腦跑大多數程序已經沒有壓力,無需在意他使用什么語言。然后,函數式編程語言重生。
你可以這樣理解函數式編程語言:用函數編程,但讓,事實上,比想象中還要更加接近字面意思。你可以使用其他函數標準創建函數,編寫函數。
這里有一個(簡單)的FP特性列表
你也許不會再以他的中文翻譯,但是,你會在意他們到底是什么意思。
First-Class Functions:可以在變量中存儲函數。我想你已經做過如下面 JavaScript的內容。
var add = function(a, b){ return a + b }
你現在正在存儲一個匿名函數,得到a,b,以及返回a+b到add變量。
High-Order Functions:函數可以返回函數,像參數一樣接收函其他數。
JavaScript:
document.querySelector('#button') .addEventListener('click', function(){ alert('yay, i got clicked') })
或者
var add = function(a){ return function(b){ return a + b } } var add2 = add(2) add2(3) // => 5
上面兩個例子都是High-Order Functions例子,盡管,你可能從未謝過如此代碼,你也可能在某個地方見過這種格式。
Pure Functions:函數不改變值,值接收數據和輸出數據,和數學運算函數相似。這也意味著,如果為函數f傳遞2,并返回10,他將會返回10.跟環境、線程、或其他求值命令無關。在其他編程中也不會受影響,非常有用。
Closures:可以在使用的特殊返回函數中保存一些數據,比如返回函數保持執行環境。
var add = function(a){ return function(b){ return a + b } } var add2 = add(2) add2(3) // => 5
High-Order函數的第二個例子中,變量a是封閉的,只能用于返回函數。事實上,閉包并不是FP特色,只是優化。
Immutable State:無法改變任何狀態(即使可以新建也不行),在下面的例子(in OCaml),使用x和5在項目中交換。x永遠等于5。
let x = 5;; x = 6;; print_int x;; (* prints 5 *)
看起來并不是好功能,不過關鍵時候可以救命。
分布式、并發應用程序的時代終于來臨了。不過,我們還沒準備好:我們現在的(比如:使用的)并行模型,雖然可以解決問題,卻帶來復雜性。
得到一個更好的應用,我們需要一個更簡單、可靠的方式來實現。記得我們上面提到的幾種功能嗎?Pure Functions 和 Immutable State?誠然,你可以在不同核心或者機器上運行無數次函數,你只能得到相同的輸出結果。因此,你可以使用相同的代碼,在1個核心上使用,也可以在1000個核心上使用。
"但是為什么我不能繼續使用OOP ?"
萬事開頭難。我想你學習編程付出了很大的努力,甚至還在學習OOP。也許,現在的你使用OOP比你剛開始學習編程的時候簡單多了。為什么呢?因為你已經熟悉許多常用語了,比如變量聲明、 for/while 循環。
對于剛開始學習FP的人,就想是重新學習編程一樣(取決于你開始學習哪種語言,從哪里開始)。
許多人說,FP可讀性不好。如果你有學習過規則的背景,函數式編程看起來就像個crypt語言,并不是因為他是crypt,而是你并不熟悉那些常用語。當你掌握基礎之后,他的可讀性就增強了。
來看看下面的Haskell 和 JavaScript 代碼:
guess :: Int -> [Char] guess 7 = "Much 7 very wow." guess x = "Ooops, try again." -- strongly inspired by //learnyouahaskell.com
function guess(x){ if(x == 7){ return "Much 7 very wow." } else { return "Oops, try again." } }
這是一個很簡單的程序。當你正確輸入7后會輸出一個賀詞,不然會輸出錯誤信息提示。
Haskell可以使用2行代碼完成是怎樣做到的(忽略第一行)。如果你理解了Pattern Matching(匹配模式),這個問題就非常簡單了。
Haskell 做了些什么:
如果函數接收內容等于7,他返回"Much 7 very wow",否在返回"Ooops, try again."。
這就是JavaScript代碼做的事情,Haskell匹配編程者提供的"模式"。
plus1 :: [Int] -> [Int] plus1 [] = [] plus1 (x:xs) = x + 1 : plus1 xs -- plus1 [0,1,2,3] -- > [1,2,3,4]
在上面的程序中,plus1是一個得到Ints列表的函數。為每個元素添加1。與空List []匹配(沒有其他匹配,返回另一個空列表)。通過定義模式來確認非空列表:為列表中第一個元素命名為x,剩下的為xs。然后用求和和遞歸調用返回。
我可以肯定,你在使用這兩行Imperative Style代碼重寫 plus1 的時候胡出現錯誤。不過他依舊有可讀性。
那么,新的一年,Functional Programming ,讓我們從現在開始吧!
轉載請注明:文章轉載自:慧都控件網 及英文出處:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn