天天看點

談談函數式程式設計

函數式程式設計 ( 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) {

}

繼續閱讀