柯里化
柯里化是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數而且返回結果的新函數的技術。
柯里化幫助我們將任意多元函數變?yōu)橐辉瘮堤幚怼?/p>
柯里化實現的意義?
實現柯里化到底有啥意義或者好處呢?
- 代碼能夠更好的復用
- 這是對函數參數的一種緩存
- 讓函數更靈活,讓函數的粒度更小,便于函數組合產生最大的功能
柯里化的用法
我們舉一個很簡單的例子,實現一個年齡比較大小方法
function checkAge(min){
return function(age){
return age>= min
}
}
const age = checkAge(18)
age(20)//true
age(10)//false
age(18)//true
這樣寫法可以使代碼更好的復用,當你比較其他數字時再獲取比較數字的方法就好。
柯里化的原理模擬
柯里化的本質就是把多元函數改為一元函數處理。
//模擬curry
function curry(func){
return function curriedFn(...arg){
if(arg.length < func.length){//如果實際參數的個數小于形參個數,我們要返回一個新的函數
return function () {
return curriedFn(...arg.concat(Array.from(arguments)))
}
}
//實際參數大于等于形參個數
return func(...arg)
}
}
function getSum (a,b,c){
return a + b + c;
}
const curried = curry(getSum)
console.log(curried(1,2,3))
console.log(curried(1)(2,3))
console.log(curried(1)(2)(3))
函數組合
函數組合的概念
若一個函數要經過多個函數處理才能得到最終值,這個時候可以把中間過程的函數合并成一個函數。
- 函數就像數據的管道,函數組合就是把這些管道連接起來,讓數據穿過多個管道形成最終結果。
- 函數組合默認執(zhí)行順訊是從右往左執(zhí)行。
下面舉一個反轉數組后拿到數組第一個元素的功能
function reverse (arr) {
return array.reverse()
}
function first(arr){
return array[0]
}
function compose(f,g){
return function(val){
return f(g(val))
}
}
const last = compose(first,reverse)
last([1,2,3,4,5])
函數組合滿足結合律
函數之間的組合滿足結合律,意思就是我們現在有f,g,h三個函數,我們既可以先讓f,g組合,再與h組合,又可以先讓g,h組合,再和f組合。
總結
這篇文章主要總結了函數柯里化和函數組合,下一篇會總結函子的概念和用法。
函數式編程01