함수자와 모나드
함수자(Functor)
- 같은 타입을 반환하는 map 메소드를 구현한 객체 / 특정 조건을 만족하는 객체, 컨테이너
- JS의 Array Set Map 도 Functor이다
- 클래스.of() 로 생성 가능
- 함수자 응용
- Maybe 함수자
- 우아하게 에러처리 하기위한 컨테이너
- 파이프라인 도중 결과값에 예상치 않은 null, undefined이 나타나 사이드 이펙트 퍼지는걸 대응하기 위해 생겨난 함수자
- 중간에 예상하지 않는 값나오면 원래 가려던 길과 다른 길로 간다
- Just와 Nothing 두가지 경우로 나눠서 Nothing 중간에 나오면 계속 Nothing으로 흘러간다
- Railway Oriented Programming
- Either 함수자
- Maybe 함수자는 예외 사항에 기본 값(Nothing)만 리턴해서 마무리 특별한 로직 불가능
- Either 함수자는 한 수 위로 동작
- Left 와 Right로 나눠서 함수자 생성하게 해서 루틴을 흘러가게 한다
- Nothing이 나오더라도 분기해서 로직 가능하게 된다
모나드
- 모다드는 chain을 추가 구현한 함수자이다
- 함수자 이기 때문에 map도 물론 구현 되어있다
- chain 메소드가 모나드가 가진 값에 함수를 적용해서 새로운 모나드를 반환해야 한다.
- chain의 역할은 map으로 중첩된 함수 pipe라인을 벗겨내며 평탄화한다.
- 중첩된 map들은 결과를 한층으로 보이게 해서 간단하게 만든다
- 만약 풀지 않는다면 Maybe의 값인 Maybe의 값인 Maybe의 값인 이런 식으로 결과가 도출된다
- monad를 이용하면 map의 중첩 없이 항상 값을 감싸는 상자 형태의 함수 합성이 가능해진다
- Maybe 함수자나 Either함수자도 chian을 구현하면 모나드가 된다
JS에서는 함수자나 모나드 개념을 잘 사용하지 않는다
- 제공되는 Array 객체나 Promise가 에러처리 함수자나 모나드 체이닝 직접 구현없이도 함수 합성 모두 안전하게 도와주기 때문
- Array와 Promise 같은 JS 구조체에는 함수형 철학이 들어있구나 배우게 되었다!
참고