LeoWangJ / blog

紀錄學習文章
1 stars 0 forks source link

柯里化(curry) #15

Open LeoWangJ opened 5 years ago

LeoWangJ commented 5 years ago

把支持多個參數的函式轉成只支持單一參數的函式形式,大多應用在函數式編程。

假設我們目前有一個相加函式

let add = (a,b) => a + b
add(1,2) // return 3

使用curry方式來表達的話則是

let add = a => b => a + b
add(1)(2)

使用閉包來記錄第一個參數使得執行返回的函數時能夠調用第一個參數來相加。

那假如我們希望使用一個函式能夠將多個參數形式的函式轉變成curry函式時該怎麼做呢?

let currify = (fn,params = []){
    let newParams = params.conact(arg)
    return (arg) = >{
       if(newParams.length === fn.length){
           return fn(...newParams)
       } else {
           return currify(fn, newParams)
       }
    }
}

addTwo = (a,b)=>a+b
addThree = (a,b,c)=>a+b+c

let newAddTwo = currify(addTwo)
newAddTwo(1)(2) // return 3

let newAddThree = currify(addThree)
newAddThree(1)(2)(3) // return 6

上面currify的思路是

  1. 若當前參數數量為傳入函式的形參則執行該函式
  2. 若不是則代表還沒到最後一個參數,所以繼續執行currify
  3. newParams則代表有執行過的參數