elegant-functional-2023 / elegant-function-2023

우아한스터디 2023 여름시즌: 쏙쏙 들어오는 함수형 코딩 스터디 레포입니다.
MIT License
5 stars 1 forks source link

커링(Currying) #4

Open sa02045 opened 1 year ago

sa02045 commented 1 year ago

p286) 고차함수 - 함수를 반환하는 함수

function makeAdder(n){
   return function(x){
      return n + x
   }
}

makeAdder(1)(3) // 4

함수를 반환하는 함수로 볼 수도 있고 커링이라고 볼 수도 있는 것 같다! 책에는 직접적으로 커링에 대해서 언급하고 있진 않지만 살짝 맛보기로 알아보도록 해보자

커링(Currying)

f(a, b, c) -> f(a)(b)(c)

다중 인수을 갖는 함수를 단일 인수를 갖는 함수들의 함수열로 변환하는 기법 또는 함수

커링함수

// 커링 변환하는 함수
function curry(func) {
  return function curried(...args) {
    if (args.length >= func.length) {
      return func.apply(this, args);
    } else {
      return function(...args2) {
        return curried.apply(this, args.concat(args2));
      }
    }
  };
}

function foo(a,b,c){

}

var curryFunction = curry(foo)

// 변환
curryFunction(a)(b)(c)

커링기법의 장점

p287)에 나오듯 고차함수의 장점이 커링의 장점이라고 볼 수 있을것 같습니다.

하지만 책에서 경고하듯이 직관적인 방법과 항상 비교하는 것이 중요한것 같다!

하스켈 커링함수

함수형 언어 하스켈은 기본적으로 모든 함수가 커링 변환되어 동작한다

let plus x y = x + y
let f = plus(2)
f(3) // 5

또는
plus 2 3 // 5

Haskell B. Curry라는 수학자

참고

  1. https://itholic.github.io/haskell-function1-currying/
  2. https://ko.javascript.info/currying-partials
chloe-codes1 commented 1 year ago

Currying을 사용하면 함수의 실행을 늦출 수 있다는 장점이 있다