정적타입, 자동메모리 관리, 타입추론, 일등함수 기반으로, 패턴매칭, 고차타입, 모나드 등 고급기능 제공
typescript는 패턴매칭, 고차타입을 생략 함으로 가장 쉬운 함수형언어(?)
패턴매칭, 고차타입은 매우 복잡..해서 요즘은 고차타입은 없이 패턴매칭정도만 있음(Kotlin, switft)
=> 패턴매칭? 고차타입?
=> 모나드 ?
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;
함수의 역할
(x :T) -> f -> (y: R)
아이덴티티 함수
입력값 x를 가공없이 그대로 반환하는것 , 입력타입 == 출력타입
?? 이함수의 필요성을 모르겠음
type MapFunc<T, R> = (T) => R;
type IdentityFunc<T> = MapFunc<T, T>;
const numberIdentity: IdentityFunc<number> = (x: number): number => x;
8-3 고차 함수와 커리
arity : 매개변수 갯수
고차 함수란?
return값이 함수일때.. 고차함수
1차는 바로 값, 2차는 1차함수, 3차는 2차함수 return
export const add: SecondOrderFunc<number, number> = (
x: number
): FirstOrderFunc<number, number> => (y: number): number => x + y;
console.log(add(1)(2)); // 함수호출연산자를 두번 연속해서 쓰는것을 커리(curry) 라함
부분 적용함수와 커리
arity보다 적은수로 호출 하면 부분함수라 한다.
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 메모리 해제
// 고차함수가 부분함수가 아닌 값을 리턴했을때, 자유변수 메모리가 해제되는 유효범위를 클로져라고 한다.
8장 함수 조합의 원리와 응용
8-1 함수형 프로그래밍이란?
=> 패턴매칭? 고차타입? => 모나드 ?
8-2 제네릭 함수
타입스크립트의 제네릭 함수 구문
함수의 역할
아이덴티티 함수
8-3 고차 함수와 커리
고차 함수란?
부분 적용함수와 커리
클로저
8-4 함수 조합
compose function
pipe function
pipe, compose 분석