在函式式程式設計中,任何**可以都是函式,且要求具有返回值,如下示例
// 非函式式
var title = "functional programming";
var saying = "this is not";
console.log(saying + title); //
=> this is
not functional programming
// 函式式
var say = title=>
"this is " + title;
var text = say("functional programming"); //
=> this is functional programming
純函式
純函式在這裡指函式內外間是「無」關聯的。主要有下面兩點
// 非純函式(函式內依賴函式外的變數值)
var title = "functional programming";
var say = ()=> "this is not" + title; // <= 依賴了全域性變數 title
// 純函式
var say = (title)=>"this is " + title; // <= 依賴了以引數 title 傳入
say("functional programming");
不可變資料(immutable)
這裡主要是指變數值的不可變。當需要基於原變數值改變時,可通過產生新的變數來確保原變數的不變性。
// 可變資料
var arr = ["functional", "programming"];
arr[0] = "other"; //
<= 修改了arr[0]的值
console.log(arr) //
=> ["other", "programming"] // 變數arr值已經被修改
// 不可變資料
var arr = ["functional", "programming"];
// 得到新的變數,不修改了原來的值
var newarr = arr.map(item=> else
})console.log(arr); //
=> ["functional", "programming"] 變數arr值不變
console.log(newarr); //
=> ["other", "programming"] 產生新的變數newarr
之所以使用這種不變值,除了更好的函式式程式設計外,還能夠維持執行緒安全可靠,落地在業務中,實際上也能讓**更加清晰。
設想,如果你定義了乙個變數a,a在其他地方被其他人修改了,這樣是不方便定位a的當前值的。關於定義多個變數引發的記憶體等問題,可以通過重用結構或部分引用的方式來減輕,可參考 immutable.js。
函式柯里化 currying
柯里化 是將多參函式轉換成一系列的單參函式。
// 乙個多參函式
varadd = (a, b) => a + b;
add(1, 2); // => 3
// 柯里化函式
varadd = a => b => a + b;
var add1 = add(1);
add1(2); // => 3
上面柯里化後的函式呼叫方式也有所轉變,第一次傳入乙個引數返回了乙個函式,再傳入引數則完成整體的呼叫,這也是利用的閉包的特性。
組合函式 compose
顧名思義,組合函式是將多個函式進行組合成乙個函式。
var
compose = (fn1, fn2) =>
(arg) => fn1(fn2(arg));
var a = arg=> arg + 'a';
var b = arg=> arg + 'b';
var c = compose(a, b); // 將a,b函式進行組合
c('c'); //
=> cba
上面示例中,當呼叫組合函式 c 時,傳入的引數會經過 b 函式,接著將 b 函式的返回值作為 a 函式的引數值,從而輸出最終結果。
組合函式 c 就像管道一樣,將水流( 返回值 )流經各個函式中進行處理。
當想要組合很多函式成一條很長很長的「管道」時,那麼顯然上面的 compose 函式已經不夠用了。下面看看 redux 是怎麼做這個 compose 工具函式的。
// 源自: redux/src/compose.js
export default
function
compose
(...funcs) else
}
**很簡潔,主要利用了遞迴方式和陣列的 reduceright 方法來處理,reduceright 跟 reduce 方法功能是一樣的,不同的是 reduceright 是從陣列的末尾向前逐個處理。
本文參考自談談函式式程式設計
關於函式式程式設計Scheme的學習
在揹包九講中得知scheme這門語言,是第二古老的計算機語言lisp變種,感覺很有趣,對自己思維提公升會有很大的幫助。define a hello world display a 要有括號 語句塊 字首表示式 波蘭式 符號 為注釋 相當於c 3 5 結果為 8 define a 3 4 define...
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...