애플리케이티브 펑터

애플리케이티브 스타일 프로그래밍(applicative style programming)

컨텍스트를 유지한 상태에서 함수에 의한 연속적인 데이터 변환을 체이닝하는 방식.

이더(either)

성공과 실패를 모두 포함하는 컨텍스트. 성공한 경우는 라이트가 되고, 실패한 경우는 레프트가 된다. 두 상태는 각각 다른 타입을 포함할 수 있기 때문에 이더의 타입 매개변수는 두 개다.

애플리케이티브 펑터

애플리케이티브 펑터는 펑터가 가진 한계 때문에 등장하였다.

펑터의 한계

이러한 펑터의 한계를 극복하기 위해 필요한 것이 애플리케이티브 펑터다.

  • 펑터는 일반적인 함수(transform: (A) → B)로만 매핑이 가능하기 때문에, 펑터를 입력으로 넣을 수 없다.

  • 펑터는 함수를 포함할 때, 일반 값이 아닌 또 다른 펑터 내의 값을 적용하려면 상당히 복잡한 과정을 거쳐야 한다.

  • 함수를 가진 펑터는 다른 펑터의 값을 적용해야 할 때, 컨텍스트 안에서 처리하는 것이 불가능한다.

애플리케이티브 펑터는 첫 번째 상자에 담겨 있는 함수와 두 번째 상자에 담겨있는 값을 꺼내서 매핑하고, 다시 상자 안에 넣어서 반환한다.

애플리케이티브

기본적으로 애플리케이티브는 펑터의 확장판이다. 따라서 Functor를 상속하고 있고, fmap 함수를 사용할 수 있다.

fmap 함수는 일반적인 함수를 받아서 펑터안에 값을 적용하고 다시 펑터에 넣어서 반환한다.

애플리케이티브에는 pure 함수와 apply 함수가 있다.

pure 함수

pure 함수는 임의이 값을 입력으로 받아서 애플리케이티브 안에 그대로 넣고 반환한다. 이때 반환된 애플리케이티브 펑터는 최소한의 컨텍스트다.

최소한의 컨텍스트는 입력된 값만 포함된 상태의 애플리케이티브 펑터이다. pure 함수는 어떤 값을 받아서 가공 없이 그래도 상자에 포장하는 것으로 비유할 수 있다.

apply 함수

apply 함수는 함수를 가진 애플리케이티브를 입력으로 받아서 펑터 안의 값을 함수에 적용하고, 적용한 결괏값을 애플리케이티브에 넣어서 반환한다.

애플리케이티브 펑터의 법칙

항등(identity) 법칙

pure(identity) apply af = af
fun identity() = { x:Int → x }

항등 함수에 값을 적용하는 것 외에는 아무것도 하지 않는다. 따라서 아무것도 하지 않고 그대로 af를 반환한다.

합성(composition) 법칙

pure(compose) apply af1 apply af2 apply af3 = af1 apply (af2 apply af3)
fun <P1, P2, P3> compose() = { f: (P2) → P3, g: (P1) → P2, v: P1f(g(v)) }

pure 함수에 compose 함수를 넣으려면 입력과 출력이 한 개인 함수의 체인으로 커링해야 한다.

좌변은 pure를 사용해서 애플리케이티브 펑터에 합성함수 compose를 넣고, 애플리케이티브 펑터 af1과 af2와 af3을 적용한 걸 의미한다.

우변은 애플리케이티브 펑터 af2에 af3를 적용한 애플리케이티브 펑터를 af1에 적용한 걸 의미한다.

이 좌변과 우변의 결과가 같아야 한다.

준동형 사상(homomorphism) 법칙

pure(function) apply pure(x) = pure(function(x))

좌변은 pure를 사용해서 함수 function과 값 x를 애플리케이티브 펑터에 넣는 걸 의미한다.

우변은 function 함수에 x 값을 적용한 function(x)를 애플리케이티브 펑터에 넣는 걸 의미한다.

이 좌변과 우변의 결과가 같아야 한다.

교환(interchange) 법칙

af apply pure(x) = pure(of(x)) apply af
fun <T, R> of(value: T) = { f: (T) → R → f(value) }

of는 x를 다른 함수의 매개변수로 제공하는 함수다. of 함수는 value를 적용할 함수를 만들 수 있다.

of 함수는 함수가 아닌 값 x를 미래에 적용될 함수로 만들어 줌으로써 apply의 좌변에 있는 pure 함수의 입력으로 넣을 수 있게 한다.

좌변은 어떤 함수를 포함한 애플리케이티브 펑터 af와 값 x를 넣은 애플리케이티브 펑터를 적용하는 걸 의미한다.

우변은 of(x)를 애플리케이티브 펑터에 넣어서 af에 적용하는 걸 의미한다. 이 좌변과 우변의 결과가 같아야 한다.

Last updated