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
  • μ—¬κΈ°μ„œ add와 sub은 일반 ν•¨μˆ˜λ‹€. ν•¨μˆ˜λ₯Ό 인자둜 λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.

  • callWith10은 κ³ μ°¨ ν•¨μˆ˜λ‹€. ν•¨μˆ˜λ₯Ό λ°›μ•„ λ‚΄λΆ€μ—μ„œ λŒ€μ‹  μ‹€ν–‰ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. funcλΌλŠ” μ΄λ¦„μ˜ 인자둜 addλ‚˜ sub ν•¨μˆ˜λ₯Ό λ°›μ•„, 인자둜 λ°›μ•˜λ˜ 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

callWithκ°€ callWith10이 μ•„λ‹Œ 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

Was this helpful?