Total
Search
1. map, filter, reduce
•
특징
◦
고차함수
◦
이터러블 프로토콜을 따름
▪
이터러블 프로토콜을 따르는 객체 및 제너레이터 함수 등에 다형성 활용 가능
◦
이터러블 안의 보조함수를 활용하여 수집, 필터 등 가능
1.1. map
const map = (f, iter) => {
let res = [];
for (const a of iter) {
res.push(f(a));
}
return res;
}
JavaScript
복사
예시
1.2. filter
const filter = (f, iter) => {
let res = [];
for (const a of iter) {
if (f(a)) res.push(a);
}
return res;
}
JavaScript
복사
예시
1.3. reduce
•
특정 값을 누적하면서 하나의 값을 만들때 사용
const reduce = (f, acc, iter) => {
if (!iter) {
iter = acc[Symbol.iterator]();
acc = iter.next().value
}
for (const a of iter) {
acc = f(acc, a)
}
return acc;
}
JavaScript
복사
예시
1.4. map, filter, reduce 중첩 사용
예시
2. 코드를 값으로 다루기 (go, pipe, curry)
2.1. go
•
함수들과 인자들을 전달하여 즉시 어떤 값을 평가할 때 사용 (결과 반환)
•
인자를 받아 결과를 바로 산출해내는 함수. 값을 return하는 함수
•
args를 특정함수로 축약해서 하나의 값으로 만듦
•
reduce 함수를 사용하면 특정 리스트를 축약해서 표현 가능
예시
go를 활용하여 고차함수 중첩 사용 코드 가독성 증가 가능
2.2. pipe
•
함수를 return 하는 함수
•
함수들이 나열되어있는 합성함수를 만드는 함수
◦
내부에서 go 함수를 사용
예시
2.3. curry
•
함수를 값으로 다루면서, 받아둔 함수를 원하는 시점에 평가시키는 함수
/***
* 함수를 받아서: f
* 함수를 리턴함: =>
* 리턴된 함수가 실행되었을 때: (a, ..._)
* 인자가 2개 이상이라면: _.length ?
* 받아둔 함수를 즉시 실행: f(a, ..._)
* 인자가 2개 미만이라면:
* - 함수를 리턴한 후에 (..._)
* - 그이후에 받은 인자를 합쳐서 실행 f(a, ..._)
*/
const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._);
const multi = curry((a, b) => a * b);
console.log(multi.toString()); // (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._)
console.log(multi(1).toString()); // (..._) => f(a, ..._)
console.log(multi(1)(2)); // 6
const multi3 = multi(3);
console.log(multi3(10)); // 30
console.log(multi3(5)); // 15
console.log(multi3(3)); // 9
JavaScript
복사
currying 응용 예시
2.4. 함수 조합으로 함수 만들기
예시1
예시2