https://overreacted.io/ko/algebraic-effects-for-the-rest-of-us/

대수적 효과는 멋진 개념이고 생각보다 무서운것은 아니다.

아직 실제 제품에 적용할 단계는 아니다

대수적 효과는 연구중인 프로그래밍 언어기능이다. Lisp 언어에서 유사한 기능을 제공한다고 한다.

그럼, 왜 관심을 가져야 할까?

당신이 콜백 지옥에 빠져있는데, 누군가가 async/await 을 보여줬다고 생각해보자. 멋지지 않은가?

좋아, 그럼 대수적 효과가 뭐지?

이름을 보면 뭔가 무섭게 느껴지지만, 개념은 아주 간단하다. try/catch 블록에 대해 잘 알고 있다면, 대수적 효과를 이해하는 건 매우 쉽다.

function getName(user) {
  let name = user.name;
  if (name === null) {
    throw new Error('A girl has no name'); 
  }
  return name;
}

function makeFriends(user1, user2) {
  user1.friendNames.add(getName(user2));
  user2.friendNames.add(getName(user1));
}

const arya = { name: null };
const gendry = { name: 'Gendry' };
try {
  makeFriends(arya, gendry);
} catch (err) {
  console.log("Oops, that didn't work out: ", err);}
}

getName 함수 내에서 던진, 에러는 호출 스택을 거슬러 올라가서 makeFriends 함수를 지나 가장 가까운 catch 블록까지 전달된다. 이 동작은 try/catch 구문의 중요한 특징이다. 중간에 있는 함수는 에러 핸들링에 대해 전혀 신경쓰지 않아도 된다.

try/catch 문을 사용하면 에러가 누락 될까 걱정하면서 중간에 있는 모든 레이어에서 에러를 직접 전달할 필요가 없다. 에러는 자동적으로 전달된다.

이게 대수적 효과랑 무슨 관계가 있는거지?

위의 예제에서는, 에러가 한 번 발생하면 이어서 진행할 수 없다. catch 블록에 도달하고 나면, 원래 코드를 이어서 실행할 수 있는 방법이 없는 것이다.

우리가 할 수 있는 최선은 그저 오류를 복구하거나, 기존에 하려던 동작을 어떻게든 다시 시도하는 것일 뿐, 마치 마법처럼 원래 있던 곳으로 "돌아가서" 다른 일을 할 수는 없다. 하지만, 대수적 효과를 사용하면 가능하다.