함수형 프로그래밍

Jun·2022년 5월 11일
0

네이버 부스트캠프

목록 보기
7/21

1. 함수형 프로그래밍


함수형 프로그래밍은 프로그래밍 패러다임의 한 종류이고 어떤한 언어에도 적용할 수 있다.

1. 1 함수형 vs 명령형 프로그래밍


스크린샷_2021-07-28_오후_11 38 14

1.2 1급 객체


1급 객체란 다음 조건을 만족하는 객체를 말한다.

  • 변수나 데이터 구조안에 담을 수 있음.
  • 파라미터로 전달 가능
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 관계없이 고유한 구별이 가능
  • 동적으로 프로퍼티 할당 가능

자바스크립트에서 함수는 객체이므로 1급 객체로 분류 된다.

1.3 부수 효과와 참조 투명성


  • 부수 효과 → 함수의 결과로 인해 함수 외부가 영향을 받는 것 (에러 혹은 매개변수 값 변경)
  • 참조 투명성 → 함수가 함수 외부의 영향을 받지 않는 것
    즉, 함수의 결과는 매개변수에만 의존하고 함수 외부의 세계(입력 콘솔, 파일, DB 등)에서 데이터를 읽지 않는다. 또한 함수 외부의 값을 변경하지 않는다.

참고: 부수효과 참조 투명성

1.4 순수 함수


순수 함수란 함수형 프로그래밍에 필요한 개념으로 아래 조건을 만족한다.

  • 동일한 입력은 항상 같은 값을 반환해야 한다.
  • 함수의 실행은 프로그램의 실행에 영향을 미치지 않아야 한다.
    (부수 효과 x)

순수 함수를 호출하면 프로그램의 어떠한 변화도 없고, 입력 값에 대한 결과를 예상할 수 있어서 테스트하기 쉽다.

1.5 합성 함수


합성 함수란 새로운 함수를 만들거나 계산하기 위해 둘 이상의 함수를 조합하는 과정을 말한다. 함수형 프로그래밍은 여러개의 작은 순수 함수들로 이루어져 있기 때문에 이 함수들을 연쇄적으로 호출하여 프로그램을 구축해야 한다.

const sum = set => [...set].reduce((total, v) => (total += v));
const isFactor = number => potentialFactor => number % potentialFactor === 0;
const factors = number => {
  return new Set(
    Array(parseInt(Math.sqrt(number)))
      .fill()
      .map((v, i) => i + 1)
      .filter(isFactor(number))
      .reduce((res, v) => {
        res.push(v);
        res.push(number / v);
        return res;
      }, []),
  );
};

const classifierAlpha = number => sum(factors(number)) - 2 * number;

1.6 함수형 프로그래밍 규칙


  • 모든 데이터는 변경이 불가능 해야한다.
  • 함수는 순수 함수로 만든다. 인자를 적어도 하나 이상 받고, 데이터나 다른 함수를 반환해야한다.
  • 루프보다는 재귀를 사용한다.

2. 커링


  • 커링은 인자를 여러개 받는 함수를 분리하여, 인자를 하나씩만 받는 함수의 체인으로 만드는 방법이다.
  • 커링은 f(a, b, c)처럼 단일 호출로 처리하는 함수를 f(a)(b)(c)와 같이 각각의 인수가 호출 가능한 프로세스로 호출된 후 병합되도록 변환하는 것이다.
  • 커링은 함수를 호출하는게 아니라 단지 변환할 뿐이다.

f의 두 개의 인수를 커링하는 함수 curry(f)를 생성해보자.

다른 말로 하면, f(a, b)처럼 두 개의 인수를 요구하는 함수를 f(a)(b) 형식으로 변환하는 curry(f)라는 함수를 만드는 것이다.

function curry(f) {
  // 커링 변환을 하는 curry(f) 함수
  return function (a) {
    return function (b) {
      return f(a, b);
    };
  };
}

// usage
function sum(a, b) {
  return a + b;
}

let curriedSum = curry(sum);

alert(curriedSum(1)(2)); // 3
profile
HiHi

0개의 댓글