반응형
Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

동글이의 STORY

고차함수 / 커링 / 부분적용함수 본문

Javascript/자바스크립트 패턴

고차함수 / 커링 / 부분적용함수

dongling 2024. 7. 3. 21:50
728x90
반응형
SMALL

함수형 프로그램 사용 이유

  • 부수효과 감소
  • 동일한 입력이 들어가면 동일한 출력이 나오게 하여 가독성과 유지보수를 용이

🔶 고차함수

  • 함수를 입력받아서 함수를 반환하는 함수
  • 즉, 함수 실행이 완전히 끝날때까지 최소한 두 단계에 걸친 매개변수가 존재
  • 완전히 완료되기 전에 여러번 호출 되어야함
const decimalCalculator = denominator => numerator => decimalPoint => {
    const num = numerator/denominator
    return num.toFixed(decimalPoint)
}
const divideByThree = decimalCalculator(3) => 5번째 줄
const devideTenByThree = divideByThree(10) => 6번째 줄

console.log(devideTenByThree(3))  // 3.333
console.log(decimalCalculator(3)(10)(3))  // 3.333

🔶 부분적용함수 (particial application)

  • n개의 인자를 받는 함수에 미리 m개의 인자만 넘겨 기억시켰다가, 나중에 (n-m)개의 인자를 넘기면 비로소 원래 함수의 실행결과를 얻을 수 있게끔 하는 함수
  • 고차함수를 한 번 호출하면 계속해서 사용할 수 있는 새로운 함수가 반환된다는 점이 강점
    • ex)
      • 분모가 3으로 결정된 상태에서, 분자가 계속 바뀐다면devideByThree함수를 재활용하며 인자로 분자만 계속 넘겨주면 됨
      • 분모가 3 분자가 10으로 결정된 상태에서, 소수점 자리수가 계속 바뀐다면 devideTenByThree함수를 재활용하며 인자로 소수점 자리만 계속 넘겨주면 됨

🔶 커링 (currying)

  • 커링 함수는 여러개의 인수를 받는 함수에서 정확히 인수 하나만 받는 일련의 함수를 반환할 때 사용

일반적인 커링

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

// 커링 변환을 하는 curry(f) 함수 (화살표함수 ver)
const curry = f => a => b => f(a, b);

// f에 전달된 함수
const sum = (a, b) => a + b;

const curriedSum = curry(sum);

console.log(curriedSum(1)(2)); // 3

🔻lodash를 통한 커링

lodash를 사용하면 좀 더 간단하게 커링을 구현 가능

const _ = require('lodash');

const sum = (a, b) => a + b;

const curriedSum = _.curry(sum);

console.log(curriedSum(1)(2));
  • lodash 라이브러리를 사용하여 curry함수를 사용자가 직접 정의할 필요 없이, _.curry를 사용하여 함수를 인수로 전달하여 curriedSum을 정의
728x90
반응형
LIST

'Javascript > 자바스크립트 패턴' 카테고리의 다른 글

싱글톤 패턴  (0) 2024.07.03
메모이제이션 패턴  (1) 2024.07.03
클로저  (2) 2024.07.03
프라미스 패턴  (0) 2024.07.03
콜백 패턴  (0) 2024.07.03