柯里化函數學習

背景:面試題

給定一個函數

const add = function (x, y, z) {
  return (x || 0) + (y || 0) + (z || 0);
};

要求寫一個函數fn, 通過fn(add)(1)(2)(3)(4)...方式調用。

/**
 *  相加測試
 * @returns {*}
 */
const add = function (x, y, z) {
  return (x || 0) + (y || 0) + (z || 0);
};
/**
 *  相乘測試
 * @constructor
 */
const Multiply = function (x, y, z) {
  return (x || 1) * (y || 1) * (z || 1);
}
/**
 * 柯里化函數
 * @param add  必須是一個函數
 * @returns {temp}
 */
const CurrieFn = function (add) {
  let sum;
  /**
   * 定義一個函數,拋出去供下次傳參調用
   */
  const temp = function (x) {
    sum = add(sum, x);
    return temp;
  };
  /**
   * 重寫toString和valueOf方法
   * 在參與計算、比較等涉及需要類型轉換的時候(打印也會) 會調用toString或valueOf函數 輸出結果
   * @type {fn.valueOf}
   */
  temp.toString = temp.valueOf = function(){return sum;};
  return temp
};
const addNum = CurrieFn(add)(1)(2)(3)(4);
console.log(addNum)
const MultiplyNum = CurrieFn(Multiply)(1)(2)(3)(4);
console.log(MultiplyNum)

柯里化是函數式編程的一種概念,是將函數當做參數來傳遞和返回的,且沒有副作用,因爲它是隻會返回新值,不會改變系統變量的編程方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章