Js ES6函式式程式設計 函子

2022-07-11 01:57:09 字數 2864 閱讀 7444

在正式學習函子之前,我會先丟擲乙個問題,先用普通的方式解決,然後轉換為用函子解決,這能幫助我們更好的理解函子。同時,這也是我想說的,在我們學習乙個新的知識點前,首先必須清楚為什麼會有它,或者說它是為了解決什麼問題而生的,這也是我們學習新知識後能夠快速達到學以致用的最有效方法,不然很容易被遺忘。

function double (x) 

function add5 (x)

var a = add5(5)

double(a)

// 或者

double(add5(5))

我們現在想以資料為中心,序列的方法去執行,即:

(5).add5().double()

很明顯,這樣的序列呼叫清晰多了。下面我們就實現乙個這樣的序列呼叫:

要實現這樣的序列呼叫,需要 (5) 必須是乙個引用型別,因為需要掛載方法。同時,引用型別上要有可以呼叫的方法也必須返回乙個引用型別,保證後面的序列呼叫。

class num       

add5 ()

double ()

}var num = new num(5);

num.add5 ().double ()

我們通過new num(5) ,建立了乙個 num 型別的例項。把處理的值作為引數傳了進去,從而改變了 this.value 的值。我們把這個物件返會出去,可以繼續呼叫方法去處理資料。

通過上面的做法,我們已經實現了序列呼叫。但是,這樣的呼叫很不靈活。如果我想再實現個減一的函式,還要再寫到這個 num 建構函式裡。所以,我們需要思考如何把對資料處理這一層抽象出來,暴露到外面,讓我們可以靈活傳入任意函式。來看下面的做法:

class num       

map (fn)

}var num = new num(5);

num.map(add5).map(double)

我們建立了乙個 map 方法,把處理資料的函式 fn 傳了進去。這樣我們就完美的實現了抽象,保證的靈活性。

class functor      

map (fn)

}functor.of = function (val)

functor.of(5).map(add5).map(double)

現在我們可以用 functor.of(5).map(add5).map(double) 去呼叫,是不是覺得清爽多了。

下面總結一下這個函子的幾個特徵:

說了那麼多,如果還是不理解函子概念的話,那也正常。因為仔細看看這也沒什麼的嘛,就是封裝了乙個簡單的建構函式而已,咋就整出來乙個新概念函子了呢?不理解不重要,主要是看到了函子幫我們更好的序列呼叫函式處理資料。回想一下我們上一節學的 compose,是不是很像呢?只是函子的呼叫方式顯得更加優雅。

現在,我們已經認識了乙個基礎的函子。接下來,我們需要認識乙個更加完善的函子——maybe函子...

我們知道,在做字串處理的時候,如果乙個字串是 null, 那麼對它進行 touppercase() 就會報錯。

functor.of(null).map(value => value.touppercase())

所以我們需要對 null 值進行特殊過濾:

class maybe      

map (fn)

}maybe.of = function (val)

var a = maybe.of(null).map(function (s) );

我們看到只需要把在中設定乙個空值過濾,就可以完成這樣乙個 maybe 函子。是不是so easy。

monad 函子也是乙個函子,其實很原理簡單,只不過在原有的基礎上又加了一些功能。那我們來看看它與其它的 有什麼不同吧。

我們知道,函子是可以巢狀函子的。比如下面這個例子:

function fn (e) 

var a = maybe.of( maybe.of( maybe.of('str') ) )

console.log(a);

console.log(a.map(fn));

console.log(a.map(fn).map(fn));

我們有時候會遇到一種情況,需要處理的資料是 maybe 。顯然我們需要一層一層的解開。這樣很麻煩,那麼我們有沒有什麼辦法得到裡面的值呢?

class monad       

map (fn)

join ( )

}monad.of = function (val)

這樣,我們就能很輕易的處理巢狀函子的問題了:

var  a = monad.of( monad.of('str') ) 

console.log(a.join().map(touppercase))

modan函子也是乙個很簡單的概念,僅僅多了個 join 函式,為我們處理巢狀函子。

廣州品牌設計公司

至此,js函式式程式設計已經接近尾聲。我們到底學到了什麼?

首先,我們認識到了函式式程式設計的關注點是資料的對映關係,如何將乙個資料結構更加優雅的轉化為另乙個資料結構。函式式程式設計的主體是純函式,函式的內部實現不能影響到外部環境。

然後,我們學習了幾個常用的函式式程式設計場景——柯里化、偏函式、組合和管道。 幫助我們更好的實際業務中運用函式式程式設計。

最後,我們運用函子實現了靈活的同步鏈式呼叫函式。

JS ES6函式 迭代器

允許預設值 function fun a,b 5 不傳值用 undefined fun 1,null 1,null fun 1,undefined 1,5 特殊用法示例 function fun x,y x fun 1 1,1function fun id,nums fun 0,1,2,3,4,5 ...

JS ES6 箭頭函式的用法

箭頭函式使用是比較方便簡潔的,在普通函式裡面我們通常返回乙個值時是需要return回去的,但在箭頭函式裡面已經包含著這個return所以我們不用編寫return。1.let a 3 2.function arrow a 5.arrow a 我們可以簡寫成 1.let a 3 2.let arrow ...

js ES6學習筆記 Generator函式

1 generator 函式是 es6 提供的一種非同步程式設計解決方案。形式上,generator 函式是乙個普通函式,但是有兩個特徵。一是,function關鍵字與函式名之間有乙個星號 二是,函式體內部使用yield語句,定義不同的內部狀態。2 generator函式的呼叫方法與普通函式一樣,也...