摘要:柯里化的好處通過簡單地傳遞幾個參數,就能動態創建實用的新函數而且還能帶來一個額外好處,那就是保留了函數定義,盡管參數不止一個如何實現柯里化
何為柯里化
概念:在計算機科學中,柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的
參數且返回結果是新函數的技術。
上栗子var add = function(x) { return function(y) { return x + y; } } var increment = add(1); var addTen = add(10); increment(2); // 3 addTen(2); // 12
解釋:我們定義了一個add函數,這個函數接受一個參數并返回一個新的函數。調用add之后,返回的函數通過閉包可以訪問到add的第一個參數。這樣可以使這類函數的定義和調用更加容易。
進階(for our enjoyment)var curry = require("lodash").curry; var match = curry(function(what, str) { return str.match(what); }) var replace = curry(function(what, replacement, str) { return str.replace(what, replacement); }) var filter = curry(function(f, array){ return array.filter(f); }) match(/s+/g, "hello world"); // [" "] match(/s+/g)("hello world"); //[" "] var hasSpaces = match(/s+/g); // function(x) { return x.match(/s+/g) } hasSpaces("hello world"); //[" "] hasSpaces("sssss"); // null var noVowels = replace(/[aeiou]/ig); // function(replacement, x) { return x.replace(/[aeiou]/ig, replacement) } var censored = noVowels("*"); // function(x) { return x.replace(/[aeiou]/ig, "*") } censored("Chocolate Rain"); // "Ch*c*l*t* R**n" filter(hasSpaces, ["tori_spelling", "tori amos"]); // ["tori amos"] var findSpaces = filter(hasSpaces); // function(xs) { return xs.filter(function(x) { return x.match(/s+/g) }) } findSpaces(["tori_spelling", "tori amos"]); // ["tori amos"]
這里表明的是一種“預加載”函數的能力,通過傳遞一到兩個參數調用函數,就能得到一個記住了這些參數的新函數。
當我們談論純函數的時候,我們常說函數接受一個輸入返回一個輸出。currying函數所做的正是這樣:每傳遞一個參數調用函數,就返回一個新函數處理剩余的參數。
柯里化的好處通過簡單地傳遞幾個參數,就能動態創建實用的新函數;而且還能帶來一個額外好處,那就是保留了函數定義,盡管參數不止一個
如何實現柯里化var add = function(){ var sum = 0; for(var i = 0, l = arguments.length; i < l; i++){ sum += arguments[i]; } return sum; } var curry = (function(fn){ var args = []; return function(){ if(arguments.length == 0) { return fn.apply(this, args) } else { [].push.apply(args, arguments); return arguments.callee; } } }) currySum = curry(add); currySum(1, 2, 3); currySum(1); currySum(1); currySum(1); currySum(1); currySum(); // 10
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99043.html
摘要:如果你對函數式編程有一定了解,函數柯里化是不可或缺的,利用函數柯里化,可以在開發中非常優雅的處理復雜邏輯。同樣先看簡單版本的方法,以方法為例,代碼來自高級程序設計加強版實現上面函數,可以換成任何其他函數,經過函數處理,都可以轉成柯里化函數。 我們經常說在Javascript語言中,函數是一等公民,它們本質上是十分簡單和過程化的。可以利用函數,進行一些簡單的數據處理,return 結果,...
摘要:作為函數式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。在一些函數式編程語言中,會定義一個特殊的占位變量。個人理解不知道對不對延遲執行柯里化的另一個應用場景是延遲執行。不斷的柯里化,累積傳入的參數,最后執行。作為函數式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying)...
摘要:而在函數式編程中方法是獨立于數據的,我們可以把上面以函數式的方式在寫一遍你肯定會說,你是在逗我。對比兩個生成新函數的過程,沒有柯里化的相對而言就有一點啰嗦了。 我們都知道單一職責原則,其實面向對象的SOLID中的S(SRP, Single responsibility principle)。在函數式當中每一個函數就是一個單元,同樣應該只做一件事。但是現實世界總是復雜的,當把現實世界映射...
摘要:簡介柯里化,又稱部分求值,是把接收多個參數的函數變成接受一個單一參數最初函數的第一個參數的函數,并且返回接受剩余的參數而且返回結果的新函數的技術。按照作者的說法,所謂柯里化就是使函數理解并處理部分應用。的思想極大地助于提升函數的復用性。 簡介 柯里化(Currying),又稱部分求值(Partial Evaluation),是把接收多個參數的函數變成接受一個單一參數(最初函數的第一個...
摘要:函數柯里化是指參數逐漸求值的過程。所以對于有兩個變量的函數,如果固定了,則得到有一個變量的函數通用實現先看一個簡單的例子顯然不是一個柯里化的實現。從一個通用的函數可接受任意,柯里化成專用的函數。 函數柯里化是指參數逐漸求值的過程。 我覺得它是:降低通用性,提高專用性。 通常,柯里化是這樣的過程,如果你固定某些參數,你將得到接受余下參數的一個函數。所以對于有兩個變量的函數y^x,如果固定...
閱讀 3267·2021-11-22 14:44
閱讀 1113·2021-11-16 11:53
閱讀 1264·2021-11-12 10:36
閱讀 699·2021-10-14 09:43
閱讀 3685·2019-08-30 15:55
閱讀 3399·2019-08-30 14:14
閱讀 1734·2019-08-26 18:37
閱讀 3410·2019-08-26 12:12