链接和功能组合

Pan*_*nda 4 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: 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
Run Code Online (Sandbox Code Playgroud)

这是js函数式编程课程的一个例子.我试图弄清楚我是否可以简化seq函数,所以它看起来像这样

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

????

是否有任何具体原因我必须f1作为第一个参数传递,然后将其进一步传递给reduce方法作为initialValue?? 当我不指定initialValue在reduce方法中它不会处理第一个数组元素 - accumulator- initialValue默认情况下?如果有人可以向我解释该代码中发生了什么,我将非常感激:)

Tha*_*you 6

seq()会尝试在没有累加器的情况下减少一个空数组,这是一个错误 - 并没有f1按照作者在此处编写的方式修复它.

initialValue- 用作第一次调用的第一个参数的值callback.如果未提供初始值,则将使用数组中的第一个元素.调用reduce()没有初始值的空数组是一个错误 - 源MDN:Array.prototype.reduce

seqseq()用于构建空序列时,更强大的实现不会导致错误

const identity = x =>
  x

const seq2 = (f, g) =>
  (...args) => f (g (...args))

const seq = (f = identity, ...rest) =>
  rest.reduce (seq2, f)

const up = elevator =>
  ({ floor: elevator.floor + 1 })
  
const down = elevator =>
  ({ floor: elevator.floor - 1 })

console.log
 ( seq (up, up, down, up) ({ floor: 3 }) // { floor: 5 }
 , seq () ({ floor: 3 })                 // { floor: 3 }
 )
Run Code Online (Sandbox Code Playgroud)

简化版本seq通过禁止可变功能的组成来促进更好的功能卫生

const identity = x =>
  x

const seq = (f = identity, ...rest) =>
  f === identity
    ? f
    : x => seq (...rest) (f (x))

const up = elevator =>
  ({ floor: elevator.floor + 1 })
  
const down = elevator =>
  ({ floor: elevator.floor - 1 })

console.log
 ( seq (up, up, down, up) ({ floor: 3 }) // { floor: 5 }
 , seq () ({ floor: 3 })                 // { floor: 3 }
 )
Run Code Online (Sandbox Code Playgroud)