Functor 에 대해 알아보겠습니다.
값에 함수를 적용하는 법은 어렵지 않습니다.
값의 변화 뿐만 아니라, 다른 type으로도 변환이 가능합니다. 물론 두가지 다 적용 하는것도 가능합니다.
예제들은 정해진 input과 정해진 output이있는 일반적인 함수입니다.
그렇다면 박싱된(래핑된) 값은 어떻게 함수를 적용 할까요?
박싱, 래핑이 생소 할 수 있으나 어렵지 않습니다. List, Option, Either 처럼 값을 감싼 타입을 말합니다. 하스켈에서는 이를 타입생성자 라고 부릅니다.
Functor를 알아보기 위해, type을 추상화 한 Mapper class와 map이라는 함수를 만들어 보겠습니다.
Mapper 클래스는 값을 감싼 타입입니다. 따라서 앞서 설명한 박싱된 타입이라고 할 수 있습니다.
- Mapper class는 map 함수를 사용합니다.
- 임의의 함수 f는 T를 입력받아 R을 반환합니다.
- map 함수는 Mapper<R>을 반환합니다.
2, “Hello”를 각각 입력 받고 함수에 따라 각각 값을 반환합니다. 여기서 중요한 점은 박싱된 값에 함수를 적용을 하고, 그 결과는 다시 박싱된 값이라는 점 입니다. 이게 Functor의 전부입니다.
Functor란? 박싱된 값에서 값을 뺀 후, 값에 특정 함수를 적용해 타입 과 값을 변경하고, 다시 값을 박싱하는 것을 말합니다. 변경된 값은 같은 타입일 수도 있고 다른타입일 수도 있습니다.
모던 랭귀지들의 List들은 대부분 Functor의 개념을 갖습니다. (map을 갖고 있습니다.)
Functor가 뭔지는 모르고 사용했지만, List의 map을 잘 사용하고 있었습니다. Functor의 개념을 안다면 Option, Either, RxJava 등의 원리를 이해 할 수 있습니다. 원리를 이해 함으로써 보다 좋은 코드를 작성 할 수 있을 것 입니다.