函數式程式設計 ( functional programming ) 是一種以函數為基礎的程式設計方式和代碼組織方式,能夠帶來更好的代碼調試及項目維護的優勢。本篇主要結合筆者在實際項目開發中的一些應用,簡要談談函數式程式設計。
函數
在函數式程式設計中,任何代碼可以都是函數,且要求具有傳回值,如下示例
// 非純函數(函數内依賴函數外的變量值)
var title = "functional programming";
var say = ()=> "this is not" + title; // <= 依賴了全局變量 title
// 純函數
var say = (title)=>"this is " + title; // <= 依賴了以參數 title 傳入
say("functional programming");
// 可變資料
var arr = ["functional", "programming"];
arr[0] = "other"; // <= 修改了arr[0]的值
console.log(arr) // => ["other", "programming"] // 變量arr值已經被修改
// 不可變資料
var arr = ["functional", "programming"];// 得到新的變量,不修改了原來的值
var newarr = arr.map(item => {
})
console.log(arr); // => ["functional", "programming"] 變量arr值不變
// map
var data = [1, 2, 3];
var squares = data.map( (item, index, array) => item * item );
console.log(squares); // => [1, 4, 9]
console.log(data);// => [1, 2, 3] data 還是那個 data
// reduce
var sum = [1, 2, 3].reduce( (previous, current, index, array) => previous + current );
console.log(sum); // => 6
// 一個多參函數
var add = (a, b) => a + b;
add(1, 2); // => 3
将上面的多參函數進行柯裡化,如下
// 柯裡化函數
var add = a => b => a + b;
var add1 = add(1);
add1(2); // => 3
var say = title => type => title + " is " + type;
var sayfp = say("functional programming");
var sayother = say("other programming");
sayfp("good"); // => functional programming is good
sayother("good"); // => other programming is good
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
// 源自: redux/src/compose.js
export default function compose(...funcs) {
}