摘要:簡單來說,柯里函數就是只接受一個參數的函數,柯里化的起源請參看這篇文章函數式編程入門教程通常來講,如果三個數求和的函數我們會這樣寫如果只考慮實現這個函數的柯里化,我們可以這樣做觀察上面兩種不同的寫法可以發現,第二種寫法其實就是首先把三個參數
簡單來說,柯里函數就是只接受一個參數的函數,柯里化的起源請參看這篇文章:函數式編程入門教程
通常來講,如果三個數求和的函數我們會這樣寫:
function _sum3(x, y, z) { return x + y + z }
如果只考慮實現這個函數的柯里化,我們可以這樣做:
function sum3(x) { return function(y) { return function(z) { return x + y + z } } } console.log(sum3(1)(2)(3)) // 6
觀察上面兩種不同的寫法可以發現,第二種寫法其實就是首先把三個參數收集起來,然后到最后再調用第一種寫法的函數:
function sum3(x) { return function(y) { return function(z) { return _sum3(x, y, z) } } } console.log(sum3(1)(2)(3)) // 6
所以柯里化的寫法只是把常用寫法包裝了一下,可以使用一個專用的柯里化函數實現這種包裝。柯里化函數是一種高階函數,我們把它命名為curry
function curry(fn) { return function(y) { return function(z) { return fn(x, y, z) } } } var sum3 = curry((x, y, z) => { return x + y + z }) console.log(sum3(1)(2)(3)) // 6
如果有要寫一種更加通用的,可以柯里化擁有任意多個參數的函數呢,比如sumN(1)(2)(3)...(N),按照之前的寫法,大概是這個樣子的:
function curryN(fn) { return function(a1) { return function(a2) { return function(a3) { //...... return function(aN) { return fn(a1, a2, a3, ...aN) } } } } }
很容易想到可以用一個遞歸函數來簡化這種寫法,將上面那些看起來相似的函數結構命名為nest,就可以寫為:
function nest(fn) { return function(x) { return nest(fn) } } function curry(fn) { nest(fn) }
這里缺少一個循環終止的判斷,所以nest函數先引入一個新參數i,當i === N時遞歸終止
function nest(fn, i) { return function(x) { if (i === N) { return fn(...) } return nest(fn, i + 1) } } function curry(fn) { return nest(fn, 1) }
接著,需要一個存放任意多個參數的數組,將這個數組命名為args,然后傳入nest函數
function nest(fn, i, args) { return function(x) { args.push(x) if (i === fn.length) { return fn(...args) } return nest(fn, i + 1, args) } } function curry(fn) { const args = [] return nest(fn, 1, args) }
最后在添加一個處理0個參數的情況,我們就完成了最終版的柯里化函數
function curry(fn) { if (fn.length === 0) { return fn } const args = [] return nest(fn, 1, args) }
測試一下,在線demo:
const log1 = curry((x) => console.log(x)) log1(10) // 10 const mul3 = curry((x, y, z) => console.log(x*y*z)) mul3(2)(3)(4) // 24參考文章
Currying in JS
Currying in JavaScript ES6
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94318.html
摘要:組合的概念是非常直觀的,并不是函數式編程獨有的,在我們生活中或者前端開發中處處可見。其實我們函數式編程里面的組合也是類似,函數組合就是一種將已被分解的簡單任務組織成復雜的整體過程。在函數式編程的世界中,有這樣一種很流行的編程風格。 JavaScript函數式編程,真香之認識函數式編程(一) 該系列文章不是針對前端新手,需要有一定的編程經驗,而且了解 JavaScript 里面作用域,閉...
摘要:原文鏈接和都支持函數的柯里化函數的柯里化還與的函數編程有很大的聯系如果你感興趣的話可以在這些方面多下功夫了解相信收獲一定很多看本篇文章需要知道的一些知識點函數部分的閉包高階函數不完全函數文章后面有對這些知識的簡單解釋大家可以看看什么是柯里化 原文鏈接 Haskell和scala都支持函數的柯里化,JavaScript函數的柯里化還與JavaScript的函數編程有很大的聯系,如果你感興...
摘要:柯里化通用式上面的柯里化函數沒涉及到高階函數,也不具備通用性,無法轉換形參個數任意或未知的函數,我們接下來封裝一個通用的柯里化轉換函數,可以將任意函數轉換成柯里化。 showImg(https://segmentfault.com/img/remote/1460000018998373); 閱讀原文 前言 在 JavaScript 中,柯里化和反柯里化是高階函數的一種應用,在這之前...
摘要:原題如下寫一個方法,當使用下面的語法調用時,能正常工作這道題要考察的,就是對函數柯里化的理解。當參數只有一個的時候,進行柯里化的處理。這其實就是函數柯里化的簡單應用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯過了前面的篇章,可以在這里找到: ES6 中箭頭函數的...
閱讀 2930·2021-11-23 09:51
閱讀 3103·2021-11-15 11:39
閱讀 2985·2021-11-09 09:47
閱讀 2533·2019-08-30 13:49
閱讀 2116·2019-08-30 13:09
閱讀 3101·2019-08-29 16:10
閱讀 3509·2019-08-26 17:04
閱讀 995·2019-08-26 13:57