[TIL] #16 (2022.02.25)

어느 개발자·2022년 2월 25일
0

📘 함수형 프로그래밍과 ES6+ 강의를 수강하면서 기록하였습니다.

real world에 적용시키기

유저 목록을 필터링하는 소스

var users = [
  { name: 'a', age: 21, family: [
    { name: 'b1', age: 58 }, { name: 'b2', age: 51 },
    { name: 'b3', age: 10 }, { name: 'b4', age: 22 },
  ]},
  { name: 'c', age: 31, family: [
    { name: 'c1', age: 64 }, { name: 'd2', age: 62 },
  ]},
  { name: 'd', age: 20, family: [
    { name: 'd1', age: 42 }, { name: 'd2', age: 42 },
    { name: 'd1', age: 11 }, { name: 'd2', age: 17 },
  ]},
]
go(users,
  L.map(u => u.family),
  L.flat,
  L.filter(u => u.age < 20),// 나이 필터를 해제하는 등의 코드 변경이 아주 용이하다.
  L.map(u => u.age),
  take(3), // 뽑는 명수를 변경하거나
  reduce(add),
  log);

함수형 프로그래밍을 사용할 경우 장점
1. 나이 필터를 해제하는 등의 코드 변경에 용이하다.
2. take 의 숫자만 변경하여 뽑는 명수를 변경하기도 쉽다.

모나드, Promise

함수의 합성은 수학에서 f.g 또는 f(g(x)) 로 표현한다.
f(g(x)) 는 수학에서 항상 성립하지만, 현실 세계에서는 그렇지 않다. x 가 아직 정해진 상태가 아닐 수도 있고, 이상한 값일 수도 있기 때문이다.

현실 세계에서는 이러한 경우를 대비하여 안전한 함수 합성을 위해 모나드라는 개념을 사용한다.

참고로, 모나드를 중시하는 언어가 있기도 하며 모나드 개념 자체가 없는 언어도 있다.

모나드는 간단하다

모나드를 설명할 때 이런 저런 개념을 끌고와서 설명하기 때문에 어렵다고 느껴진다.
모나드를 사용하는 것을 보면 생각보다 간단하다.

const g = a => a + 1;
const f = a => a * a;

log(f(g(1)));
[1, 2, 3, 4, 5].map(g).map(f).forEach(a => log(a));

모나드는 어려운 것이 아니다.
위의 코드에서는 [1, 2, 3, 4, 5] Arrray가 모나드이다.

Promise

Promise.resolve(1).then(g).then(f)

여기서는 Promise.resolve(1) 가 모나드이다.
다만 Promise는 위의 예시와 약간의 차이가 있는데, 값이 언제 준비될 지 모른다는 점이다.
값을 기다리다가 준비되면 g 를 실행하고, f 를 실행한다.

모나드를 왜 쓰는데?

모나드는 그냥 에러 안 나게 하려고 쓴다.

현실 세계에서는 수학의 합성처럼 흐르게 할 수 없기 때문에, 모나드를 사용하여 에러가 발생하지 않도록 할 수 있다.

0개의 댓글