從函式式程式設計到Ramda函式庫(一)

2022-01-10 03:14:34 字數 2370 閱讀 3786

函式式程式設計是種程式設計方式,它將電腦運算視為函式的計算。函式程式語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函式可以接受函式當作輸入(引數)和輸出(返回值)。和命令式程式設計相比,函式式程式設計強調函式的計算比指令的執行重要。和過程化程式設計相比,函式式程式設計裡函式的計算可隨時呼叫。

最近一直在研究函式式程式設計,從函式式程式設計中彷彿看到了js規範化的影子。大家都知道js是一門很靈活的程式語言,而這種靈活性在**量的累積下會產生質量和可控性的問題。初學js的朋友大多都是結果導向,寫的**剛剛夠用現有的專案,很難修改與擴充套件**,而且不規範的**常常讓隊友甚至是自己頭疼。而函式式程式設計卻能改變這樣的現狀。

再說函式式程式設計之前按照慣例要說一些相關的知識。

array.prototype.map()

array.prototype.slice()

string.prototype.touppercase()

像上面這樣的函式就是純函式

array.prototype.sort()

math.random()

像上面這樣的函式就不是純函式了

純函式有很多優秀的性質讓我們喜歡,

她既不會被環境改變也不會改變環境,結果只依賴傳入值。那麼這就方便我們對函式進行快取。下面以求x的平方為例(這裡用到了ramda函式庫,沒接觸也沒關係,這裡只是講概念,之後我們會提及這個函式庫)

let square = r.memoizewith(r.identity, x => x *x);

square(3); //

=> 9 第一次會呼叫原始方法並將引數和結果以key-value的形式儲存。

square(3); //

=> 9 這裡是呼叫快取

square(3); //

=> 9 這裡也是呼叫快取

由於純函式執行不需要環境,所以進行測試時我們只需要面對函式本身測試就可以了。這讓函式測試變得非常簡單

如果一段**可以替換成它執行所得的結果,而且是在不改變整個程式行為的前提下替換的,那麼我們就說這段**是引用透明的。由於純函式總是能夠根據相同的輸入返回相同的輸出,所以它們就能夠保證總是返回同乙個結果,這也就保證了引用透明性。

函式柯里化(curry)的定義很簡單:傳遞給函式一部分引數來呼叫它,讓它返回乙個函式去處理剩下的引數。下面我們對比一下柯里化之前的函式和柯里化的函式。

let add = (x, y, z) => x + y +z;

add(1,2,3) //

=> 6;

let add = (x, y, z) =>

}}add(1)(2)(3) //

=> 6;

後者就是柯里化的函式,它利用了函式的記憶性記住了每次傳你進去的引數並返回了可繼續執行的函式。是不是感覺發現了新大陸?

函式組合(compose)就是把多個純函式組合起來解決函式巢狀問題。下面我們來看兩個例子

let compose = (f, g, h) => x =>f(g(h(x)));

let add = x => x + 4;

let mul = x => x * 2;

let mis = x => x - 1;

compose(add, mul, mis)(1) //

=> 3

let compose = (f, g, h) => x =>f(g(h(x)));

let getfirst = arr => arr[0];

let getuppercase = str =>str.touppercase();

let getreverse = arr =>arr.reverse();

compose(getuppercase, getfirst, getreverse)(['v', 'a', 'd', 'i', 'm']); //

=> 'm'

因為純函式的純潔性,我們可以把多個函式組合起來,注意一定是純函式。

point-free簡單地說就是無需使用所要處理的值,只關注運算過程。可以用公式 fn = r.pipe(f1, f2, f3);表示,也就是說如果事先定義了函式f1,f2,f3就可以推算出函式fn,因此無需使用引數形式,下面我們來對比一下兩種形式。

let nopointfree = word => word.touppercase().split('-');

let pointfree = compose(split('-'),touppercase);

pointfree 模式能夠幫助我們減少不必要(中間變數)的命名,讓**保持簡潔和通用。

關於函式式程式設計先講一下基礎的知識,下一節我來講一下js函式式程式設計優秀的函式庫----ramda函式庫。

從微服務到函式式程式設計

之前很早有過微服務的小經驗 但是實際地整體的來個人全盤把控還沒有多少把握 從eureka,到nacos,還有各種元件,雖然都知道其使用 但是如果站在更高層面上來統攬全域性 還是很差的 函式式響應式程式設計相較於命令式在 上更抽象一層 實現了響應式流以及函式式引數地相關操作與繫結等 同時也離不開原本地...

linux C程式設計 MYSQL函式庫

用c語言連線mysql資料庫有兩個步驟 1 初始化乙個連線控制代碼結構 2 建立連線 初始化乙個連線控制代碼結構 函式原型 mysql mysql init mysql mysql 引數說明 mysql 為null,則分配乙個 返回其指標 或按照傳入的結構指標進行初始化。mysql 返回值,若為nu...

程式設計 函式庫 動態庫 靜態庫

通常被認為是函式庫,說白了就是乙個檔案,檔案中包含大量的函式實現的二進位制 指令 比如我們所使用printf函式 動態庫 鏈結動態庫生成可執行程式,並沒有把庫中函式的實現指令直接拿過來寫入可執行程式中,而是在可執行程式中記錄了庫中函式的符號資訊。優缺點 生成可執行程式比較小,執行時動態庫被載入到記憶...