학습정리 06

Coding-Luizy·2023년 7월 18일
0

영속 자료 구조

영속 자료 구조 — Pesistent Data Structures
는 불변 자료구조의 특성(데이터의 값이 변하지 않는다)을 유지하면서 추가시에 시공간 복잡도를 줄일 수 있는 방법이다.

함수형 프로그래밍

공부할것,

순수함수
외부 상태 참조 x, 입력과 출력 같게

불변성 유지
인자를 변경 x 새로운 버전의 새로운 오브젝트를 만들어서 반환

Object.freeze로 불변성으로 만들기

Expressions Only
if. for x

First-class, higher-order finctions

모나드..?

pipe, go, curry

go, pipe, curry

함수형 프로그래밍 강의

일급

  • 값으로 다룰 수 있다.
  • 변수에 담을 수 있다.
  • 함수의 인자로 사용될 수 있다.
  • 함수의 결과로 사용될 수 있다.

일급 함수

  • 함수를 값으로 다룰 수 있다.
  • 코드를 값으로 다룰 수 있다.
  • 조합성과 추상화의 도구
// 변수에 담을 수 있다.
const add = a => a+2

// 함수의 인자로 사용될 수 있다.
log(add2);

//함수의 결과로 사용될 수 있다.
const f = () => () => 1;

map

const map = (f: Function, iter) => {
    let res = [];
    for (const i of iter) {
        res.push(f(i));
    }
    return res;
};

reduce

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;
}

go

const go = (...args) => reduce((a, f) => f(a), args);

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

pipe

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

curry

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 대신 필터걸로

부작용 없이,

Monad

3분 Monad

완전요약

제네릭 T

특정 파라미터의 타입을 추상화한거다.

모나드란

제네릭이 타입을 추상화했다면

모나드는 연산을 추상화

합성이 가능한 연산

우리가 함수형에서 함수들을 체이닝

선언적으로 프로그래밍을 하기 위해서는 특정 함수의 호출로
함수안에 추상화해서

이 과정에서... 여러가지 연산이 필요

A -> B
과정에 서브 프로그램들로
하지만 결국은

여러개의 수많은 연산들로 이어져있다.

A -> B
B -> C

  • A -> C

연산을 합칠 수 있다.

List\<A>

A class가 있는데
객체에 대해서 a.map(x => new Tuple(x.num)) 타입이 바뀐다
왜? 타입이 바꼈는데 모나드?

즉 맵이랑 플랫맵은

언제든 데이터를 다른타입로 바꿀 수 있다.

a.map(람다 다음 타입을 결정).map(람다).map(람다) ...

연산을 나타내는 타입 M

이게 모나드이려면 퓨어와 컴포즈가 존재해야한다.

int toString toCharArray

Compose(toString, toCahrArray): 새로운 연산

퓨어와 컴포즈를 가지고 있어야 모나드

모나드라는 인터페이스라면

퓨어와 컴포즈를 상속

연산을 합쳐서 하나의 연산을 만든다

프로그램은 하나의 큰 모나드이다

프로그램은 모나드들의 연결해놓은것이다.

함수는 state를 가지면 안된다.

profile
Better Tomorrow

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

아주 유용한 정보네요!

답글 달기