kgneng2 / blokg

blog
MIT License
0 stars 0 forks source link

Do it Typescript 8장 #28

Open kgneng2 opened 3 years ago

kgneng2 commented 3 years ago

8장 함수 조합의 원리와 응용

8-1 함수형 프로그래밍이란?

=> 패턴매칭? 고차타입? => 모나드 ?

8-2 제네릭 함수

타입스크립트의 제네릭 함수 구문

// g1은 a의 매개변수가 제네릭 타입으로 지정되었고, g2는 a,b매개변수가 각각 다른 제네릭 타입으로 지정
// g3,g4는 g1,g2를 화살표로 바꿈
function g1<T>(a: T): void {}
function g2<T, Q>(a: T, b: Q): void {}
const g3 = <T>(a: T): void => {};
const g4 = <T, Q>(a: T, b: Q): void => {};

//type 별칭
type Type1Func<T> = (T) => void;
type Type2Func<T, Q> = (T, Q) => void;
type Type3Func<T, Q, R> = (T, Q) => R;

함수의 역할

아이덴티티 함수

type MapFunc<T, R> = (T) => R;
type IdentityFunc<T> = MapFunc<T, T>;
const numberIdentity: IdentityFunc<number> = (x: number): number => x;

8-3 고차 함수와 커리

고차 함수란?

export const add: SecondOrderFunc<number, number> = (
  x: number
): FirstOrderFunc<number, number> => (y: number): number => x + y;

console.log(add(1)(2)); // 함수호출연산자를 두번 연속해서 쓰는것을 커리(curry) 라함

부분 적용함수와 커리

const add2: SecondOrderFunc<number, number> = add3(1);
const add1: FirstOrderFunc<number, number> = add2(2);

console.log(
  add1(3), //6
  add2(2)(3), //6
  add3(1)(2)(3) //6
);
// 위에 3개 다 전부 동일

클로저

function add(x: number): (number) => number {
  // 바깥 유효 범위
  return function (y: number): number {
    // 안쪽 유효 범위
    return x + y; // 클로저 , x는 이해할수 없는 변수,(자유변수라고 한다)
  };
}

const add1 = add(1); // 변수 x 메모리 유지
const result = add1(2); // result에 3 저장 후 변수 x 메모리 해제
// 고차함수가 부분함수가 아닌 값을 리턴했을때, 자유변수 메모리가 해제되는 유효범위를 클로져라고 한다.

p187 makeName 확인

8-4 함수 조합

compose function

export const compose = <T, R>(...functions: readonly Function[]): Function => (
  x: T
): ((T) => R) => {
  const deepCopiedFunctions = [...functions];
  return deepCopiedFunctions.reverse().reduce((value, func) => func(value), x);
};

const composedFGH = compose(h, g, f)
console.log composedFGH('x')) // h(g(f(x)))

pipe function

pipe, compose 분석

export const pipe = (...functions : Function[]) : Function