파이프 라인 함수
함수만을 인자로 받는 함수로, 함수 여러 개를 입력받아
첫번째 함수 출력이 그 다음 함수의 입력이 된다.
data = 입력 => fn1 = 출력/입력=> fn2 ==........... => 최종
pipe
reduce 특화함수
함수만을 인자로 받는 함수, 즉, 함수를 하나로 축약한다.
pipe의 인자로 올수 있는 함수는 전부 curryr 이 적용된 함수여야 한다.
/*리듀스 특화 함수, 함수만을 인자로 받는 함수*/
function pipe(){
const fns = arguments;
return function(val){
return reduce(fns,function(val,fn){
return fn(val);
}, val );
};
}
/*이전 reduce 실습 내용*/
console.log(_.reduce([1,2,3,4,5],(sum,val)=>sum+val,0));
console.log(_.reduce([1,2,3,4,5],(sum,val)=>sum+val,10));
console.log(_.reduce([1,2,3,4,5],(sum,val)=>sum+val,-10));
console.log(_.reduce([1,2,3,4,5],(sum,val)=>sum+val ));
//30세 이상 사용자 age 합
console.log(_.reduce(_.map(upperAge30(users),u=>u.age),(sum,val)=>sum+val ));
//30세 이상 사용자 age 합, pipe 사용
_.pipe(
_.filter(u=>u.age>=30),
_.map(u=>u.age),
_.reduce((sum,val)=>sum+val),
console.log
)(users);
/* 단순히 인자 순서만 변경, 화살표 함수로만 표현 */
function curryr(fn){
return function(a,b,c){
if(arguments.length === 2) return fn(a,b);
else if (arguments.length === 3) return fn(a,b,c); //수정
else return b => fn(b,a);
};
}
커링이 적용된 함수만 pipe에 올 수 있는 이유
//30세 이상 사용자 age 합, pipe 사용
const tmpFilter = _.filter(u=>u.age>=30);
const tmpMap = _.map(u=>u.age);
const tmpReduce = _.reduce((sum,val)=>sum+val);
console.log(tmpFilter);
console.log(tmpMap);
console.log(tmpReduce);
_.pipe(
tmpFilter,
tmpMap,
tmpReduce,
console.log
)(users);
상세 풀이
이제 부터는 위 과정을 console.log에 도달할 때까지 반복한다.
요약
pipe는 함수만을 인자로 받는 고차함수로 reduce의 특화함수다.
단, 함수는 커링이 적용된 함수여야 한다. 평가 시점을 조정해 데이터가 들어오면, 바로 사전에 적용된 클로저 상태 함수가 줄줄이 수행되게 하기 위함이다.
go
/*pipe 즉시 실행 버전*/
function go(data){
//첫번째 데이터만 제외하면 함수 배열이다.
const fns = rest(arguments);
//함수 배열이기 때문에 arg1, arg2 ... argN 풀어주려면 apply를 사용한ㄷ.
return pipe.apply(null,fns)(data);
}
_.go(users,
tmpFilter,
tmpMap,
tmpReduce,
console.log
);
go 함수는 단순히 pipe를 실행하는데 함수로 인자 순서를 조정해 실행할 뿐이다.
'개발 > 함수형 프로그래밍' 카테고리의 다른 글
07 - 컬렉션 중심 프로그래밍 - map (수집하기) (0) | 2023.06.17 |
---|---|
06 - 다형성 높이기 (0) | 2023.06.16 |
04 - map, filter에 curryr 적용, reduce (0) | 2023.06.12 |
03 - 커링, curry, curryr (0) | 2023.06.11 |
02 - map, filter, each (0) | 2023.06.09 |