這裡有乙個純函式示例
var z = 10;
function
add(x, y)
注意add函式沒有去碰變數z,它沒有讀取z的值,也沒有儲存資料到z。它僅僅是讀取引數x和y,也就是它的輸入引數。
再看另乙個函式
function
justten
()
這也是純函式,但是是乙個沒有用的純函式,因為它沒有引數,唯一能做的就是返回乙個常數,更好的做法將justten定義成乙個常量。再來看下面這個函式
function
addnoreturn
(x, y)
雖然也是純函式,但是沒有返回值,沒有任何輸出,是乙個無用的函式。所以,所有有用的純函式都應該返回一些東西
function
add(x, y)
console.log(add(1, 2)); // 3
console.log(add(1, 2)); // 3
注意add(1, 2)的結果總是3,因為這是乙個純函式,如果add函式使用了外部的值,你根本不可能**它的行為。純函式對於給定相同的輸入,總是產生相同的輸出由於純函式不能修改任何外部變數,以下所有函式都是不純的
writefile(filename);
sendajaxrequest(ajaxrequest);
這些函式都有所謂的***,當你呼叫它們的時候,它們會修改檔案和資料庫表,所以你不能**它們會發生什麼。純函式沒有***在函式式變成中,你不僅僅編寫純函式,我們目標是減少不純**的數量並將它們和我們程式中的其他部分隔離
如果乙個值要經過多個函式,才能變成另乙個值,可以把中間步驟合併成乙個函式,這叫做函式的合成
上圖中,x和y之間的變形關係是函式f,y和z之間的變形關係是函式g,那麼x和z之間的關係,就是g和f的合成函式g·f。
const compose = function
(f, g)
}
函式的合成還必須滿足結合率
// 等同於
compose(compose(f, g), h);
// 等同於
compose(f, g, h)
合成也是函式必須是純的乙個原因。因為乙個不純的函式,怎麼跟其他函式合成?怎麼保證各種合成以後,它會達到預期的行為?
前面說過,函式就像資料的管道(pipe)。那麼,函式合成就是將這些管道連了起來,讓資料一口氣從多個管道中穿過。
f(x)和g(x)合成為f(g(x)),有乙個隱藏的前提,就是f和g都只能接收乙個引數,如果可以接收多個引數,比如f(x, y)和g(a, b, c),函式合成就會非常麻煩
這時就需要函式柯里化了。所謂」柯里化」,就是把乙個多引數的函式,轉化為單引數函式。
function
add(x, y)
add(1, 2) // 3
function
add(x)
}add(1)(2)
有了柯里化以後,我們就能做到,所有函式只接受乙個引數。後文的內容除非另有說明,都預設函式只有乙個引數,就是所要處理的那個值。
函式不僅可以用於同乙個範疇之中值的轉換,還可以用於將乙個範疇轉成另乙個範疇。這就涉及到了函子(functor)
函子是函式式程式設計裡面最重要的資料型別,也是基本的運算單位和功能單位。
它首先是一種範疇,也就是說,是乙個容器,包含了值和變形關係。比較特殊的是,它的變形關係可以依次作用於每乙個值,將當前容器變形成另乙個容器。
可以理解為值是輸入的一組引數,變形關係是引數處理邏輯,函子將他們轉化為另一組新資料。一般約定,函子的標誌就是容器具有map方法。該方法將容器裡面的每乙個值,對映到另乙個容器。學習函式式程式設計,實際上就是學習函子的各種運算。
接下來的原文太過理論化,等以後加深理解再補充
python基礎函式式程式設計(十七)
概念 包括lambda函式的程式設計 高階函式變成 print sum 1,2,3 def test x,f return f x x 1,2,3 print test x,sum lamda匿名函式 def test x,y return x 2 y 這個lamda實現的函式和上面的函式是等價的 ...
函式式程式設計基礎 高階函式和偏函式
一 高階函式 所謂高階函式是指可一把函式作為引數,或者是可以將函式作為返回值的函式 我們見得閉包函式就是高階函式 function foo x 對於程式的編寫,高階函式比普通函式要靈活的多,除了通常意義的函式呼叫返回外,還形成了一種後續傳遞風格的結果接收方式,而非單一的返回值形式,後續傳遞風格的程式...
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...