go, pipe 함수

이재철·2022년 8월 7일
0
post-thumbnail

코드를 값으로 다룰때 go, pipe를 구현하여 전체적인 코드의 표현력을 높여보자

	a(b,c(d,e()));

예제 코드는 함수가 연속으로 중첩되어 가독성이 떨어진다. 또한 작성, 해석하기 힘듬
더 읽기 쉽게 코드를 작성하기 위해 go, pipe 함수를 활용하자

📌 go 함수


정의

인자를 전달받아 결과를 바로 산출하는 함수,
첫번째 인자는 시작되는 값을 받고, 나머지 함수를 받아 순서대로 결과를 만듬

구현

  • reduce 를 사용하여 쉽게 구현이 가능
  // reduce 함수구현
  const reduce = (f, acc, iter) => {
    if (!iter) {
      iter = acc[Symbol.iterator]();
      acc = iter.next().value;
    }
    for (const a of iter) {
      acc = f(acc, a);
    }
    return acc;
  };
    // go 함수구현
	const go = (...args) => reduce((a, f) => f(a), args);
	
	go(0,
       a => a + 1,
	   a => a + 10,
       a => a + 100,
       console.log);
	// 111
	

	const add = (a , b) => a + b;
	go(add(0, 1),
	   a => a + 10,
       a => a + 100,
       console.log);
	// 111

좋은 코드만들어 보기

    const products = [
        { name: '반팔티', price: 15000 },
        { name: '긴팔티', price: 20000 },
        { name: '핸드폰케이스', price: 15000 },
        { name: '후드티', price: 30000 },
        { name: '바지', price: 25000 },
    ];

    const add = (a, b) => a + b;
    console.log(
        reduce(
            add,
            map(p => p.price,
            filter(p => p.price < 20000, products))
        )
    ); // 30000

    // 순차적으로 실행하며 읽기 좋은 코드
    go(
        products,
        products => filter(p => p.price < 20000, products),
        products => map(p => p.price, products),
        prices => reduce(add, prices),
        console.log
    ); // 30000

📌 pipe 함수


정의

함수를 리턴하는 함수
인자로 함수를 받아 그 함수들을 합성하여 하나의 함수를 리턴함

구현

    // pipe 함수구현
    // 내부에서 go를 사용함
	const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);
	
	const f = pipe(
       a => a + 1,
	   a => a + 10,
       a => a + 100
       );
	
	const f = pipe(
       (a, b) => a + b,
	   a => a + 10,
       a => a + 100
       );

	console.log(f(0, 1)); // 111
	

실행 과정

	// pipe 함수들을 인자로 전달받음
	pipe = (...fs) => {};
    
	// 함수를 리턴
    pipe = (...fs) => () => {};
    
	// arg는 pipe 함수가 실행되어 함축된 함수 -> 함수의 매개 변수
	pipe = (...fs) => arg => {};

	// 함수 함축을 위해 pipe 인자로 들어온 함수들을 reduce 처리
    // reduce를 시작으로 arg를 전달
	pipe = (...fs) => arg => fs.reduce(() => {}, arg);

	// reduce 실행 시 a가 pipe 함수의 실행 결과인 함수의 인자 값이 들어감
	// 그 이후 실행 결과 값이 a 되어 누산처리
	pipe = (...fs) => arg => fs.reduce((a, f) => f(a), arg);

📌 go함수 vs pipe함수


차이점

  • go 함수는 인자로 받은 함수들을 모두 실행시켜 결과에 해당값을 리턴
  • pipe 함수는 인자로 받은 함수를 모두 합쳐 합성된 함수를 리턴




https://www.inflearn.com/course/functional-es6/dashboard

profile
혼신의 힘을 다하다 🤷‍♂️

0개의 댓글