Higher-Order Function

About

Higher-Order Function : 고차함수

고차함수란, 함수를 다루는 함수를 말한다.

함수를 다룬다

함수를 다룬다는 것은 다음과 같은 것을 말한다.

  1. 함수를 인자로 받아 대신 실행하는 함수

  2. 함수를 리턴하는 함수

  3. 함수를 인자로 받아서 또 다른 함수를 리턴하는 함수

사실상 함수형 프로그래밍의 절반은 '고차 함수를 적극적으로 활용하는 프로그래밍'이라고 할 수 있다.

유명한 고차함수들로는 Underscore.js_.map, _.filter, _.reduce 이 있다. (혹은 ES6의 그것)

Example

함수를 인자로 받아 대신 실행하는 함수

function callWith10(val, func) {
  return func(10, val)
}

function add(a, b) {
  return a + b
}

function sub(a, b) {
  return a - b
}

callWith10(20, add) // 30
callWith10(5, sub) // 5
  • 여기서 addsub은 일반 함수다. 함수를 인자로 받거나 함수를 리턴하지 않기 때문이다.

  • callWith10은 고차 함수다. 함수를 받아 내부에서 대신 실행하기 때문이다. func라는 이름의 인자로 addsub 함수를 받아, 인자로 받았던 val과 함께 10을 인자로 넘기면서 대신 실행한다.

함수를 리턴하는 함수

function constant(val) {
  return function() {
    return val
  }
}

var always10 = constant(10)

always10() // 10
always10() // 10
always10() // 10

constant 함수는 실행 당시 받았던 10이라는 값을 받아 내부에서 익명 함수를 클로저로 만들어 val을 기억하게 만든 후 리턴한다.

리턴된 함수에는 always10이라는 이름을 지어주었고, always10을 실행하면 항상 10을 리턴한다. constant처럼 함수를 리턴하는 함수도 고차 함수다.

함수를 대신 실행하는 함수를 리턴하는 함수

이번엔 위의 두 예시를 조합해서 함수를 대신 실행하는 함수를 리턴하는 함수를 만들어본다.

function callWith(val1) {
  return function(val2, func) {
    return func(val1, val2)
  }
}

var callWith10 = callWith(10)
callWith10(20, add) // 30

var callWith5 = callWith(5)
callWith5(5, sub) // 0

callWith(30)(20, add) // 50
callWith(20)(20, sub) // 0

callWithcallWith10이 아닌 callWith가 되어 숫자가 아닌 값도 활용할 수 있다.

console.log(callWith([1, 2, 3])((v) => v * 10, _.map))
// [10, 20, 30]

var callWithUsers = callWith([
  { id: 2, name: 'HA', age: 25 },
  { id: 4, name: 'PJ', age: 28 },
  { id: 5, name: 'JE', age: 27 },
])

callWithUsers(2, _.get)
// { id: 2, name: 'JE', age: 25 }
callWithUsers((user) => user.age > 25, _.find)
// { id: 4, name: 'PJ', age: 28 }
callWithUsers((user) => user.age > 25, _.filter)
// [{ id: 4, name: 'PJ', age: 28 },
//  { id: 5, name: 'JE', age: 27 }]
callWithUsers((user) => user.age > 25, _.some)
// true
callWithUsers((user) => user.age > 25, _.every)
// false

Summary

함수형 프로그래밍은 함수에 인자를 언제 어떻게 적용할 것인가, 함수를 인자로 언제 어떻게 적용할 것인가, 인자로 받은 함수를 언제 어디서 평가할 것인가 등에 대한 이야기이기도 하다.

응용형 함수, 부분 적용(partial application), 커링(currying), 고차 함수(higher-order function) 등은 모두 인자와 관련된 함수형 프로그래밍의 특징들이다.

Last updated