2 回答

TA貢獻1795條經驗 獲得超7個贊
第一種方法更通用,因此可能更有用。考慮您希望在多個輸入上調用一些管道函數的情況,而不僅僅是一個:
const pipe = (x, ...fns) => fns.reduce((v, f) => f(v), x);
console.log(
pipe(1, x => x + 2, x => x * 2),
pipe(3, x => x + 2, x => x * 2),
);
太丑了 高階函數可以讓您編寫更少重復的代碼:
const pipe = (...fns) => x => fns.reduce((v, f) => f(v), x);
const changeNum = pipe(x => x + 2, x => x * 2);
console.log(
changeNum(1),
changeNum(3),
);
如果您處于不必多次調用管道函數的情況下,那么一種方法相對于另一種方法并沒有太多具體的好處(也許,對于參數輸入 - 具有相同的參數,例如...fns, 可能被認為比混合表示根本不同事物的參數更優雅,例如(x, ...fns))。
也就是說,不必考慮您所處的情況會更容易,在這種情況下,無論如何標準pipe功能(...fns) => x =>是更可取的,因為它對于所有情況都足夠靈活,與替代方案不同。

TA貢獻1794條經驗 獲得超8個贊
給定curry = f => x => y => f(x, y)并且uncurry = f => (x, y) => f(x) (y)它們是相同的,即您可以將一種形式轉換為另一種形式,反之亦然(忽略其余參數)。
但問題是,為什么您首先要為自己的功能帶來負擔?為什么函數的數量完全不同?如果每個函數只接受一個參數,它們的 API 將被簡化,我們可以將它們結合起來,限制更少:
const fold = f => acc => xs => xs.reduce((acc, x) => f(acc) (x));
const pipe = g => f => x => f(g(x));
const flip = f => y => x => f(x) (y);
const id = x => x;
const pipen = fold(pipe) (id);
const comp = flip(pipe);
const compBin = comp(comp) (comp);
const compBin3 = compBin(compBin) (compBin);
const inc = x => x + 1;
const sqr = x => x * x;
const add = x => y => x + y;
console.log(
"pipen",
pipen([inc, inc, inc, inc, sqr]) (1)); // 25
console.log(
"compBin",
compBin(add) (add) (2) (3) (4)); // 9
console.log(
"compBin3",
compBin3(add) (add) (add) (2) (3) (4) (5)); // 14
沒有人會定義comp
和compBin
我做的方式。它應該只是說明可能性。
添加回答
舉報