關於函式式程式設計

2021-08-20 12:57:34 字數 2575 閱讀 6924

函式

在函式式程式設計中,任何**可以都是函式,且要求具有返回值,如下示例

// 非函式式

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...