Javascript 链接与函数组合

Javascript 链接与函数组合,javascript,functional-programming,chaining,function-composition,Javascript,Functional Programming,Chaining,Function Composition,下面是我试图理解的一段代码: const seq2 = (f1, f2) => { return (...args) => { return f2( f1( ...args) ); } } const seq = ( f1, ...fRest) => fRest.reduce( seq2, f1 ); const elevator = { floor: 5 }; const up = elevator => { return { floor:

下面是我试图理解的一段代码:

const seq2 = (f1, f2) => {
 return (...args) => {

  return f2( f1( ...args) );
 }
}



const seq = ( f1, ...fRest) =>
 fRest.reduce( seq2, f1 );

const elevator = {
 floor: 5
};

const up = elevator => {
 return {
  floor: elevator.floor + 1
 }
};

const down = elevator => {
 return {
  floor: elevator.floor - 1
 }
};


const move = seq( up, up, down, up);
const newElevator = move( elevator );



console.log( newElevator.floor ) // shows 7
这是js函数式编程课程的一个例子。我想知道我是否可以简化seq函数,使它看起来像这样

const seq=(…fRest)=>
fRest.reduce(seq2)

是否有任何具体原因使我必须将
f1
作为第一个参数传递,然后将其作为
初始值
进一步传递给reduce方法??如果我不在reduce方法中指定
初始值
,默认情况下,它不会将第一个数组元素-
累加器
-视为
初始值
?如果有人能向我解释一下代码中发生了什么,我将不胜感激:)

seq()
将尝试在没有累加器的情况下减少空数组,这是一个错误–并不是说
f1
以作者在这里编写的方式解决了这个问题

initialValue
–用作
回调的第一个调用的第一个参数的值。如果没有提供初始值,将使用数组中的第一个元素。在没有初始值的空数组上调用
reduce()

当使用
seq()
构建空序列时,更健壮的
seq
实现不会导致错误

const identity=x=>
x
常数seq2=(f,g)=>
(…args)=>f(g(…args))
常量seq=(f=标识,…剩余)=>
剩余部分减少(序号2,f)
const up=电梯=>
({楼层:电梯层+1})
常数下降=电梯=>
({楼层:电梯。楼层-1})
console.log
(seq(向上、向上、向下、向上)({floor:3})/{floor:5}
,seq()({floor:3})/{floor:3}

)
您试过了吗?它在工作是的,它在工作。但我想知道作者编写这个函数时是否有理由使用
f1
参数??我不认为这背后有什么特别的原因。也许他不知道你能做到。也许这就是他喜欢使用
reduce
的方式。无论如何,两者都是一样的。@ibrahimmahrir没有初始累加器的还原是无效的。如果这是您直接从课程材料中提取的代码,那么编写它的人应该为参数/变量提供更多的描述性名称。