摘要:里也有柯里化的實現,只是平時沒有在意。如果函數柯里化后雖然生搬硬套,不過現實業務也會有類似場景。
柯里化
先解釋下什么是 柯里化
在計算機科學中,柯里化(英語:Currying),又譯為卡瑞化或加里化,是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數而且返回結果的新函數的技術。
js 里也有柯里化的實現,只是平時沒有在意。先把原文簡介貼出來,此文都來自于它,有興趣的可直接訪問:JavaScript 專題之函數柯里化
里面有段方法,關于柯里化函數:
// https://github.com/mqyqingfeng/Blog/issues/42#issuecomment-323919896 var curry = fn => (judge = (...args) => args.length === fn.length ? fn(...args) : arg => judge(...args, arg));
設計 es6 的一些特性,或許一下子很難理解,這里稍微寫的再繁瑣下:
var curry = function(fn) { /** * judge * args: 柯里化函數的參數 */ return function judge() { var args = [].slice.call(arguments); // 柯里化定義的函數參數 == 調用該函數的參數 if (args.length >= fn.length) { return fn(...args); } else { // 通過 ()() 形式調用 -- 柯里化 return function() { var args2 = [].slice.call(arguments); // 拼接成新的參數,遞歸繼續judge return judge.apply(null, args.concat(args2)); }; } }; };場景舉例
參數調用來調用去,都暈了,那到底有什么用呢?
比如:實現不同幅度的相加功能
var sum = function(increment, number) { return increment + number; }; // 雖然都是相同的相加邏輯,可能在函數命名、功能定義上會有不同(當然這里只是硬性舉個例子)。 var addOne = sum; var addTen = sum; console.log(addOne(1, 5)); //6 console.log(addTen(10, 5)); //15
如果函數柯里化后:
var addOne = curry(sum)(1)(5); //6 var addTen = curry(sum)(10)(5); //15
雖然生搬硬套,不過現實業務也會有類似場景。這里能體會到 curry 帶來的好處:
定制化。原有共性的方法,被拆成符合不同場景的業務方法
參數明確。由于 curry 是根據固定參數約定的,所以通過()()形式固化了參數用意(比如第一個是累加數,第二個是被相加數)
再舉一個簡單的 Promise 實現舉個例子:
function MyPromise(fn) { // currying this.resolveFn = function(callback) { return callback; } this.then = function(callback) { fn(this.resolveFn(callback)); } } new MyPromise(function(resolve, reject) { setTimeout(function() { resolve(true) }, 1000) }).then(function(data) { console.log(data); })參考
我只是知識點的“加工者”, 更多內容請查閱原文鏈接 , 同時感謝原作者的付出:
函數式編程入門教程
JavaScript 專題之函數柯里化
柯里化 維基百科
關于我如果你覺得這篇文章對你有幫助, 請點個贊或者分享給更多的道友。
也可以掃碼關注我的 微信訂閱號 - [ 前端雨爸 ], 第一時間收到技術文章 , 工作之余我會持續輸出
最后感謝閱讀, 你們的支持是我寫作的最大動力
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/104672.html
摘要:函數柯里化在函數式編程中,函數是一等公民。函數柯里化的主要作用和特點就是參數復用提前返回和延遲執行。可能在實際應用場景中,很少使用函數柯里化的解決方案,但是了解認識函數柯里化對自身的提升還是有幫助的。 最近在整理面試資源的時候,發現一道有意思的題目,所以就記錄下來。 題目 如何實現 multi(2)(3)(4)=24? 首先來分析下這道題,實現一個 multi 函數并依次傳入參數執行,...
摘要:但是,對函數式編程而言,這個行為的重要性是毋庸置疑的。關于該模式更正式的說法是偏函數嚴格來講是一個減少函數參數個數的過程這里的參數個數指的是希望傳入的形參的數量。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 關于譯者:這是一個流淌著滬江血液的純粹工程:認真,是 HTML 最堅實的梁柱;分享,是...
摘要:柯里化通用式上面的柯里化函數沒涉及到高階函數,也不具備通用性,無法轉換形參個數任意或未知的函數,我們接下來封裝一個通用的柯里化轉換函數,可以將任意函數轉換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數的一種應用,在這之前...
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。 作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying),又稱部分求值(Partial Evalu...
摘要:引言上一節介紹了高階函數的定義,并結合實例說明了使用高階函數和不使用高階函數的情況。我們期望函數輸出,但是實際上調用柯里化函數時,所以調用時就已經執行并輸出了,而不是理想中的返回閉包函數,所以后續調用將會報錯。引言 上一節介紹了高階函數的定義,并結合實例說明了使用高階函數和不使用高階函數的情況。后面幾部分將結合實際應用場景介紹高階函數的應用,本節先來聊聊函數柯里化,通過介紹其定義、比較常見的...
閱讀 3019·2021-11-24 10:21
閱讀 1588·2021-10-11 10:57
閱讀 2803·2021-09-22 15:24
閱讀 2659·2021-09-22 14:58
閱讀 2331·2019-08-30 13:16
閱讀 3478·2019-08-29 13:05
閱讀 3411·2019-08-29 12:14
閱讀 3440·2019-08-27 10:55