[무료] 자바스크립트로 알아보는 함수형 프로그래밍 (ES5) - 인프런 | 강의

마플(http://www.marpple.com)의 CTO 유인동님이 알려주는 함수형 프로그래밍에 대한 강좌 입니다. 함수형 프로그래밍으로 라이브러리를 직접 만들어가며 함수형 프로그래밍의 패러다임과 코딩의 즐거

www.inflearn.com

파이프 라인 함수

함수만을 인자로 받는 함수로, 함수 여러 개를 입력받아

첫번째 함수 출력이 그 다음 함수의 입력이 된다.

 

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);

간략 설명

상세 풀이

_.pipe에 함수인자를 넣어 호출(아직 users 호출전)
each함수 list가 함수들인 것을 알 수 있다.
list[0] 상세 설명
다음 함수 map

이제 부터는 위 과정을 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를 실행하는데 함수로 인자 순서를 조정해 실행할 뿐이다.

function.html
0.01MB

+ Recent posts