go, pipe, curry

joDMSoluth·2020년 3월 13일
0

함수형프로그래밍

목록 보기
7/17

코드를 값으로 다루어 표현력 높이기

go, pipe

// 즉시 평가
const go = (...args) => {
  reduce((a, f) => f(a), args);
};

go([
  0,
  a => a + 1,
  a => a + 10,
  a => a + 100,
  console.log]);
// 111

// 다형성
go(
  add(0, 1),
  a => a + 10,
  a => a + 100),
  log);
const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);

const f = pipe(
  a => a + 1,
  a => a + 10,
  a => a + 100);

console.log(f(0));

// 다형성
const f = pipe(
  (a, b) => a + b,
  a => a + 10,
  a => a + 100);

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

go를 이용한 좋은 코드

go(
  products,
  products => filter(p => p.price < 20000, products),
  products => map(p => p.price, products),
  prices => reduce(add, prices),
  console.log);

go + curry를 이용하여 더 좋은 코드

// 함수를 받고 함수에 대한 인자를 받는다. 원하는 인자의 개수가 충족되면 받은 함수를 실행한다.
const currry = f =>
	(a, ..._) => 
	_.length
	? f(a, ..._) 
	: (..._) => f(a, ..._);
// 함수를 받아서 함수를 리턴
// 리턴된 함수가 실행되었을 때 인자가 2개 이상이라면
// 받아둔 함수를 즉시 실행
// 인자가 2개보다 작다면 함수를 리턴한 다음 그 후에 받은 인자랑 함쳐서 실행

const mult = curry((a, b) => a * b);
console.log(mult(3)(2));

const mult3 = mult(3);
console.log(mult3(10));
console.log(mult3(5));
console.log(mult3(3));

//----------------
// 더 좋은 코드
const _map = curry(map);
const _filter = curry(filter);
const _reduce = curry(reduce);

go(
  products,
  filter(p => p.price < 20000),
  map(p => p.price),
  reduce(add),
  console.log);

pipe를 이용하여 중복 제거

const total_price = pipe(
  map(p => p.price),
  reduce(add));

// 이 코드를
go(
  products,
  filter(p => p.price < 20000),
  map(p => p.price),
  reduce(add),
  console.log);

// 중복제거
go(
  products,
  filter(p => p.price < 20000),
  total_price,
  console.log);

// 더 중복제거
const base_total_price = predi => pipe(
  filter(predi),
  total_price);

// 더 중복 제거
go(
  products,
  base_total_price(p => p.price < 20000),
  console.log);
profile
풀스택이 되고 싶은 주니어 웹 개발자입니다.

0개의 댓글