자바스크립트 Promise = kleisli composition

boyeonJ·2023년 9월 4일
1

Kleisli composition

Kleisli composition은 함수형 프로그래밍에서 두 개의 Kleisli 함수를 조합하는 기술을 가리킵니다. Kleisli 함수는 모나드를 사용하는 함수로, 입력을 받아 모나드 값을 반환합니다. 이러한 함수를 조합하여 모나드 내의 값을 연속적으로 처리하거나 변환하는 작업을 가능하게 합니다.

-- 모나드 M의 Kleisli 함수 정의
kleisliFuncA :: A -> M<B>
kleisliFuncB :: B -> M<C>

-- Kleisli 함수 조합
composedKleisliFunc :: A -> M<C>
composedKleisliFunc = kleisliFuncA >=> kleisliFuncB

Promise = kleisli composition

Promises는 kleisli composition을 지원하는 도구입니다.

kleisli composition을 지원한다는 말의 의미는?

함수 합성을 언제나 안전하게 할 수 있으며, 이를 통해 순수한 함수형 프로그래밍을 가능하게 하는(수학적으로 프로그래밍을 바라볼 수 있도록) 보장해줍니다.

예를 들어 f,g 함수를 합성할 경우 f(g(x)) = f(g(x)) 식을 수학적으로 바라볼 경우 항상 성립되어야 합니다. 그렇지만 실제로는 해당 식이 성립되지 않는 여러가지 요인이 발생할 수 있습니다. 그렇게 될 경우 이는 순수한 함수형 프로그래밍을 가능하게 하는(수학적으로 프로그래밍을 바라볼 수 있도록) 보장해주지 못합니다.

kleisli composition는 이를 지원해줍니다. 이를 지원해주기 위해서는 에러 처리를 해주어서 에러가 발생하더라도 f(g(x)) = f(g(x)) 라는 식이 성립되도록 해주어야 합니다.

결론적으로 Promise는 reject와 catch를 통해 언제나 f(g(x)) = f(g(x)) 라는 식이 성립되도록 에러 처리를 해줄 수 있기 때문에 kleisli composition을 지원한다고 표현할 수 있습니다.

const user = [
  {id:1, name: 'aa'},
  {id:2, name: 'bb'},
];

const getUserById = id => find(u=>u.id===id,user) || promise.reject('없어요!');
const ({name}) => name;
const g = getUserById;

const fg = id => f(g(id));
const fg = id => promise.resolve(id).then(g).then(f).catch(a=>a);

fg(3).then(log);

0개의 댓글