Record

개념

  • 함수형 프로그래밍은 자료 처리를 수학적 함수의 계산으로 취급하고, 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.
  • 문이 아닌 식이나 선언으로 수행되는 선언형 프로그래밍 패러다임을 따르고 있다.

목차

순수함수 (Pure function)

  • 동일한 입력에는 항상 같은 값을 반환해야 한다.
  • 함수의 출력(return)은 오로지 그 함수에 입력된 값(input)에만 의존한다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다.
    • (Self-contained되어야 한다, 즉, side effect가 없다.)
      • Side effect가 없다는 의미는 오로지 출력(return) 만 수행한다는 의미이다.

Function composition

  • 둘 이상의 함수를 조합하는 과정을 말한다.
  • 함수형 프로그램은 여러 작은 순수 함수들로 이루어져있기 때문에 이 함수들을 연쇄적으로 또는 병렬로 호출해서 더 큰 함수를 만드는 과정으로 전체 프로그램을 구축해야 한다.

    • 재사용이 가능한 순수 함수를 원하는 Output을 위해 서로 엮는 것이다. 함수를 엮기 때문에 고차원함수(Higher-Order Functions)를 활용해야 한다.

      • 고차원 함수(Higher-Order Functions)
        • 함수를 인자(argument)로 받는다.
        • 함수를 결과로 반환한다.
    • 함수형 프로그래밍에서는 함수가 1등급 객체(first-class object)이다. 함수가 1등급 객체이므로, 함수는 고차원 함수를 구현할 수 있다.

      • 1등급 객체(first-class object (citizen, type, entity, value로 표현되기도 한다.)
        • 자료구조에 저장된다.
        • 인자(argument)로 전달된다.
        • 결과로 반환한다.
        • 함수가 실행되는 동안 새로운 함수가 만들어질 수 있다.

Immutability(불변성)

  • 함수형 프로그래밍에서 Immutabiltity도 중요한 개념이다.
    • <Input(입력값)의 Immutability>라는 의미는 는 것이다.
      • 순수함수는 예측된 input과 함께 실행된다.
      • Input이 변하면, 순수함수는 개발자가 예측하지 않은 다른 출력값을 만든다.
      • 즉, 다른 출력값은 다른 함수에도 영향을 미친다.
    • 순수함수는 input이 변경되지 않도록, 또는 input이 immutable하도록 가능한 self-contained 되도록 설계되어야 한다.

Function decoration

  • 순수함수를 재사용하다보면, 이미 만들어진 순수함수를 그대로 적용하기보다 일부 개선하거나, 조금 다른 방향으로 수정해야 하는 상황이 발생할 수 있다. 이 때 function decoration을 적용한다.
  • 직접적으로 순수 함수를 수정하진 않지만, 함수에 실행 시점이나 방식을 조율하는 것을 말한다. (ex, memorize, debounce)

Arity Mismatch (w. Partial Application, Curring)

  • 순수 함수를 조합하다보면, 인자의 수가 서로 맞지 않는 순수함수를 엮어야 하는 상황이 있을 수 있다. 이 상황을 Arity Mismatch라 한다.
    • 함수는 무조건 1개의 return 값만 나온다.
    • 순수함수 중에는 2개 이상의 인자를 필요로 하는 함수가 있을 수 있다.
    • 따라서 1개의 순수함수가 아닌 2개 이상의 순수함수에서 실행된 출력값을 받아와야하는데, 이렇게 인자의 수가 서로 맞지 않는 상황을 Arity Mismatch라 한다.
  • Partial Application, Curring으로 Arity Mismatch 상황을 해결할 수 있다.
    • Partial Application : 인자를 부분적으로 먼저 엮어준다.
    • Curring : 인자를 하나씩만 받는 함수의 체인으로 만드는 방법이다.
    //Partial (예시는 Lodash _.partial이다.) [출처](https://marpple.github.io/partial.js/)
    function add(a, b, c) {
    return a + b + c;
    }
    var addTenFive = _.partial(add, 10, 5); //10과 5를 미리 합쳐준다!
    console.log(addTenFive(5)); // 미리 10과 5가 합쳐줬기 때문에 20이 나온다.
    //Curring
    function before(a) {
    return function after(b) {
        return a + b;
    }
    }
    var word = before("이렇게");
    var finalWord = word("붙어요!");
    console.log(finalWord); //이렇게붙어요!