영속 자료 구조 — Pesistent Data Structures
는 불변 자료구조의 특성(데이터의 값이 변하지 않는다)을 유지하면서 추가시에 시공간 복잡도를 줄일 수 있는 방법이다.
공부할것,
순수함수
외부 상태 참조 x, 입력과 출력 같게
불변성 유지
인자를 변경 x 새로운 버전의 새로운 오브젝트를 만들어서 반환
Object.freeze로 불변성으로 만들기
Expressions Only
if. for x
First-class, higher-order finctions
모나드..?
pipe, go, curry
// 변수에 담을 수 있다.
const add = a => a+2
// 함수의 인자로 사용될 수 있다.
log(add2);
//함수의 결과로 사용될 수 있다.
const f = () => () => 1;
const map = (f: Function, iter) => {
let res = [];
for (const i of iter) {
res.push(f(i));
}
return res;
};
const reduce = (f, acc, iter) => {
if (liter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for (const a of iter) {
acc = f(acc, a);
}
return acc;
}
const go = (...args) => reduce((a, f) => f(a), args);
go(
0,
a => a + 1,
a => a + 10,
a => a + 100,
console.log // 111
);
const pipe = (f, ...fs) => (...as) => go(f(...as), ...fs);
const f = pipe(
(a, b) => a + b,
a => a + 10,
a => a + 100
);
console.log(f(0, 1)); // 111
const curry = f => (a, ..._) => (_.length ? f(a, ..._) : (..._) => f(a, ..._));
const mult = curry((a, b) => a * b);
console.log(mult(3)(2)); // 6
const mult3 = mult(3);
console.log(mult3(3)); // 9
console.log(mult3(4)); // 12
명령형 아니라 선언형 프로그래밍
명령형
동작을 일일이 기술
선언형
명령형으로 작성된걸 순수함수로 구현해서
따라서, 선언적으로 프로그램
분기를 가지기보다
if 대신 필터걸로
부작용 없이,
완전요약
제네릭 T
특정 파라미터의 타입을 추상화한거다.
모나드란
제네릭이 타입을 추상화했다면
모나드는 연산을 추상화
합성이 가능한 연산
우리가 함수형에서 함수들을 체이닝
선언적으로 프로그래밍을 하기 위해서는 특정 함수의 호출로
함수안에 추상화해서
이 과정에서... 여러가지 연산이 필요
A -> B
과정에 서브 프로그램들로
하지만 결국은
여러개의 수많은 연산들로 이어져있다.
A -> B
B -> C
연산을 합칠 수 있다.
List\<A>
A class가 있는데
객체에 대해서 a.map(x => new Tuple(x.num)) 타입이 바뀐다
왜? 타입이 바꼈는데 모나드?
즉 맵이랑 플랫맵은
언제든 데이터를 다른타입로 바꿀 수 있다.
a.map(람다 다음 타입을 결정).map(람다).map(람다) ...
연산을 나타내는 타입 M
이게 모나드이려면 퓨어와 컴포즈가 존재해야한다.
int toString toCharArray
Compose(toString, toCahrArray): 새로운 연산
퓨어와 컴포즈를 가지고 있어야 모나드
모나드라는 인터페이스라면
퓨어와 컴포즈를 상속
연산을 합쳐서 하나의 연산을 만든다
프로그램은 하나의 큰 모나드이다
프로그램은 모나드들의 연결해놓은것이다.
함수는 state를 가지면 안된다.
아주 유용한 정보네요!