JavaScript - go, pipe, curry

Code_Alpacat·2022년 6월 9일
0

JavaScript - 중급

목록 보기
5/11

1. go

1) 개념

  • 중첩된 함수들 (map, filter, reduce)을 코드 가독성을 높여 사용할 수 있도록 결과 값을 인자로 넘기는 함수
  • 즉시 값을 이끌어냄.
const go = (...args) => reduce((a, f) => f(a), args);

go(
  	0,
  	a => a + 1, //결과 값을 다음 함수의 인자로 전달해가며, 원하는 결과를 마지막에 얻는 함수
  	a => a + 10,
    a => a + 100,
    log
);

2) 활용

go(
	products, //첫 배열
    products => filter(p => p.price < 20000, products), //첫 연산
    products => map(p => p.price, products), //filter의 반환 값을 인자로 받아 다시 연산
    prices => reduce(add, prices), //이전 값을 받아 reduce로 가격을 모두 더해 축약
    log //가격의 총합의 반환값을 console.log(인자) 로 싫행
)

2. pipe

  • 함수들이 나열된 합성된 함수 자체를 만드는 함수

  • 값을 이끌어내는 go와 달리 함수를 이끌어냄

  • 함수를 리턴하는 함수

const pipe = (f, ...fs) => (..as) => go(f(...as), ...fs);

const f = pipe(
	a => a + 1,
  	a => a + 10,
    a => a + 100,	
);
log(f(0)) // 결과는 111

3. curry

  • 함수를 값으로 다루면서, 받아둔 함수를 원하는 시점에 평가하기위한 함수
  • 초기 인자를 받으면, 인자가 여러 개라도 저장된 초기 인자를 바탕으로 그 이후 인자들을 이용해 연산해 값을 반환함.
const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => => f(a, ..._);
//함수를 받고 리턴 => 리턴된 함수 실행 => 인자가 2개 이상이면, 받아둔 함수를 실행, 2개 미만이면 함수를 다시 리턴해 그 이후 받은 인자들을 합쳐 실행

const mult = curry((a, b) => a * b);
log(mult(1)); //인자가 하나만 전달되었으므로 함수를 리턴함.
log(mult(1)(2)); //인자를 하나 받아 인자를 저장한 함수를 리턴했으므로, 그 이후 값을 다음 인자로 활용

const mult3 = mult(3); //첫 인자 3을 결정지은 함수 리턴
log(mult3(10)) //30
log(mult3(5)) // 15
log(mult3(3)) // 9

2) go와 함께 활용

  • 기본적으로 curry를 모든 filter map reduce의 인자를 받을 때 적용해주면 축약이 가능
go(
	products, //첫 배열
    products => filter(p => p.price < 20000)(products), // products를 받아 products를 반환. 즉 축약이 가능
    products => map(p => p.price, products),
    prices => reduce(add, prices),
    log
)

go(
	products, //첫 배열
	filter(p => p.price < 20000),
    map(p => p.price),
    reduce(add),
    log
)

4. 함수의 축약

  • 두 go 함수가 있을 때, 중복되는 filter와 map 함수들이 있다.
  • pipe를 이용해 중복된 함수를 묶을 수 있다.
const total_price = pipe(
	map(p => p.price),
    reduce(add),
)

const base_total_price = predi => pipe(
	filter(predi),
    total_price);
)

go(
	products,
	base_total_price(p => p.price < 20000), //filter를 대체하는 동시에 total_price까지 함께 실행
    log
)

go(
	products,
	filter(p => p.price < 20000),
    total_price,
    log
)
profile
In the future, I'm never gonna regret, cuz I've been trying my best for every single moment.

0개의 댓글