Higher-Order Function
About
Higher-Order Function : κ³ μ°¨ν¨μ
κ³ μ°¨ν¨μλ, ν¨μλ₯Ό λ€λ£¨λ ν¨μλ₯Ό λ§νλ€.
ν¨μλ₯Ό λ€λ£¬λ€
ν¨μλ₯Ό λ€λ£¬λ€λ κ²μ λ€μκ³Ό κ°μ κ²μ λ§νλ€.
ν¨μλ₯Ό μΈμλ‘ λ°μ λμ μ€ννλ ν¨μ
ν¨μλ₯Ό 리ν΄νλ ν¨μ
ν¨μλ₯Ό μΈμλ‘ λ°μμ λ λ€λ₯Έ ν¨μλ₯Ό 리ν΄νλ ν¨μ
μ λͺ
ν κ³ μ°¨ν¨μλ€λ‘λ 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?