Functor(펑터) with Kotlin

Lazysoul
3 min readMay 15, 2017

--

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을 갖고 있습니다.)

Kotlin에서 List의 map 구현코드

Functor가 뭔지는 모르고 사용했지만, List의 map을 잘 사용하고 있었습니다. Functor의 개념을 안다면 Option, Either, RxJava 등의 원리를 이해 할 수 있습니다. 원리를 이해 함으로써 보다 좋은 코드를 작성 할 수 있을 것 입니다.

Contents

--

--