函式式程式設計基礎

2021-07-27 10:46:17 字數 2303 閱讀 8352

這裡有乙個純函式示例

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,雖然也可以歸結...