2017-02-20 35 views
2

實施例:Javascript函數式編程 - 我應該編寫強制捲曲的函數,還是在調用時使用_.curry?

版本1:

const foo = (arg1) => { 
    return (arg2) => { 
    return (arg3) => { 
     return arg1 + arg2 + arg3; 
    } 
    } 
} 
// called as part of a pipe: 
const result = pipe(bar, foo(arg1)(arg2), baz); 

版本2:

const foo = (arg1, arg2, arg3) => { 
    return arg1 + arg2 + arg3; 
} 

// called as part of a pipe: 
const result = pipe(bar, _curry(foo)(arg1)(arg2), baz); 

該方法的實現是更清潔,在第2版更優雅,但是該呼叫是一個小丑陋。由於方法調用(希望)出現在代碼庫中的多個位置,我試圖確定哪個版本具有更少的缺點。

我希望我不需要解釋爲什麼我想實現使用curried函數和傳遞單個參數。請從專業編程的角度來解決這個問題。

在此先感謝!

+2

_「我希望我不需要解釋爲什麼」 - - 你很可能會因爲會有人會問。讓我成爲第一個,你爲什麼要這麼做?你想達到什麼目的?爲什麼使它變得複雜?花時間去思考和思考這個問題可能會被用來做更簡單的路線來做其他事情。 – Joseph

+0

這是基於意見的。沒有規則。只要做你認爲合適的事情。 – ftor

+0

做一個看起來更可讀的案例,沒有人適合所有 –

回答

0

您可以使用該功能的arguments對象的情況下,你不知道有多少爭論有可能是這樣的:

function foo() { 
 
    var sum = 0; 
 
    for(var i = 0; i < arguments.length; i++) 
 
    sum += arguments[i]; 
 
    return sum; 
 
} 
 

 
console.log(foo()); 
 
console.log(foo(1, 2, 3)); 
 
console.log(foo(5, 6, 3, 7, 1, 10));

如果你想有一個鑽營是獨立於參數的數量而不強制使用_.curry,那麼使用這個:

function foo(a) { 
 
    var sum = 0; 
 
    var _ = function(a) { 
 
    if(a === undefined) 
 
     return sum; 
 
    else { 
 
     sum += a; 
 
     return _; 
 
    } 
 
    } 
 
    return _(a); 
 
} 
 

 
console.log(foo()); 
 
console.log(foo(1)(2)()); 
 
console.log(foo(1)(2)(7)(10)(5)());

+0

這麼古老的學校。如果未知參數的數量是預期的,則使用其餘運算符傳遞參數。 '函數(x,y,... args)'被解構,所以你的函數代碼更具可讀性[function(,... [a,b,c])'也可以用擴展運算符myFunc(... argArray) ' – Blindman67

相關問題