摘要:柯里化的好處通過簡單地傳遞幾個參數(shù),就能動態(tài)創(chuàng)建實(shí)用的新函數(shù)而且還能帶來一個額外好處,那就是保留了函數(shù)定義,盡管參數(shù)不止一個如何實(shí)現(xiàn)柯里化
何為柯里化
概念:在計算機(jī)科學(xué)中,柯里化(Currying)是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)(最初函數(shù)的第一個參數(shù))的函數(shù),并且返回接受余下的
參數(shù)且返回結(jié)果是新函數(shù)的技術(shù)。
上栗子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函數(shù),這個函數(shù)接受一個參數(shù)并返回一個新的函數(shù)。調(diào)用add之后,返回的函數(shù)通過閉包可以訪問到add的第一個參數(shù)。這樣可以使這類函數(shù)的定義和調(diào)用更加容易。
進(jìn)階(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"]
這里表明的是一種“預(yù)加載”函數(shù)的能力,通過傳遞一到兩個參數(shù)調(diào)用函數(shù),就能得到一個記住了這些參數(shù)的新函數(shù)。
當(dāng)我們談?wù)摷兒瘮?shù)的時候,我們常說函數(shù)接受一個輸入返回一個輸出。currying函數(shù)所做的正是這樣:每傳遞一個參數(shù)調(diào)用函數(shù),就返回一個新函數(shù)處理剩余的參數(shù)。
柯里化的好處通過簡單地傳遞幾個參數(shù),就能動態(tài)創(chuàng)建實(shí)用的新函數(shù);而且還能帶來一個額外好處,那就是保留了函數(shù)定義,盡管參數(shù)不止一個
如何實(shí)現(xiàn)柯里化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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99043.html
摘要:如果你對函數(shù)式編程有一定了解,函數(shù)柯里化是不可或缺的,利用函數(shù)柯里化,可以在開發(fā)中非常優(yōu)雅的處理復(fù)雜邏輯。同樣先看簡單版本的方法,以方法為例,代碼來自高級程序設(shè)計加強(qiáng)版實(shí)現(xiàn)上面函數(shù),可以換成任何其他函數(shù),經(jīng)過函數(shù)處理,都可以轉(zhuǎn)成柯里化函數(shù)。 我們經(jīng)常說在Javascript語言中,函數(shù)是一等公民,它們本質(zhì)上是十分簡單和過程化的??梢岳煤瘮?shù),進(jìn)行一些簡單的數(shù)據(jù)處理,return 結(jié)果,...
摘要:作為函數(shù)式編程語言,帶來了很多語言上的有趣特性,比如柯里化和反柯里化。在一些函數(shù)式編程語言中,會定義一個特殊的占位變量。個人理解不知道對不對延遲執(zhí)行柯里化的另一個應(yīng)用場景是延遲執(zhí)行。不斷的柯里化,累積傳入的參數(shù),最后執(zhí)行。作為函數(shù)式編程語言,JS帶來了很多語言上的有趣特性,比如柯里化和反柯里化。 這里可以對照另外一篇介紹 JS 反柯里化 的文章一起看~ 1. 簡介 柯里化(Currying)...
摘要:而在函數(shù)式編程中方法是獨(dú)立于數(shù)據(jù)的,我們可以把上面以函數(shù)式的方式在寫一遍你肯定會說,你是在逗我。對比兩個生成新函數(shù)的過程,沒有柯里化的相對而言就有一點(diǎn)啰嗦了。 我們都知道單一職責(zé)原則,其實(shí)面向?qū)ο蟮腟OLID中的S(SRP, Single responsibility principle)。在函數(shù)式當(dāng)中每一個函數(shù)就是一個單元,同樣應(yīng)該只做一件事。但是現(xiàn)實(shí)世界總是復(fù)雜的,當(dāng)把現(xiàn)實(shí)世界映射...
摘要:簡介柯里化,又稱部分求值,是把接收多個參數(shù)的函數(shù)變成接受一個單一參數(shù)最初函數(shù)的第一個參數(shù)的函數(shù),并且返回接受剩余的參數(shù)而且返回結(jié)果的新函數(shù)的技術(shù)。按照作者的說法,所謂柯里化就是使函數(shù)理解并處理部分應(yīng)用。的思想極大地助于提升函數(shù)的復(fù)用性。 簡介 柯里化(Currying),又稱部分求值(Partial Evaluation),是把接收多個參數(shù)的函數(shù)變成接受一個單一參數(shù)(最初函數(shù)的第一個...
摘要:函數(shù)柯里化是指參數(shù)逐漸求值的過程。所以對于有兩個變量的函數(shù),如果固定了,則得到有一個變量的函數(shù)通用實(shí)現(xiàn)先看一個簡單的例子顯然不是一個柯里化的實(shí)現(xiàn)。從一個通用的函數(shù)可接受任意,柯里化成專用的函數(shù)。 函數(shù)柯里化是指參數(shù)逐漸求值的過程。 我覺得它是:降低通用性,提高專用性。 通常,柯里化是這樣的過程,如果你固定某些參數(shù),你將得到接受余下參數(shù)的一個函數(shù)。所以對于有兩個變量的函數(shù)y^x,如果固定...
閱讀 3277·2021-11-22 14:44
閱讀 1122·2021-11-16 11:53
閱讀 1273·2021-11-12 10:36
閱讀 711·2021-10-14 09:43
閱讀 3703·2019-08-30 15:55
閱讀 3407·2019-08-30 14:14
閱讀 1746·2019-08-26 18:37
閱讀 3420·2019-08-26 12:12