9. ์ธ์ ํํ ๋ช ๋ นํ ์ฝ๋
// ๋ฆฌ์คํธ์์ ํ์๋ฅผ length ๋งํผ ๋ฝ์์ ์ ๊ณฑํ ํ ๋ชจ๋ ๋ํ๊ธฐ
function f(list, length) {
let i = 0;
let acc = 0; // ๋์ ๊ฐ
for (const a of list) { // ๋ฐ๋ณต๋ฌธ
if (a % 2) { // ์กฐ๊ฑด๋ฌธ
acc = acc + a * a; // ์ฐ์ฐ
if (++i == length) break; // ์๊ฐ๋ณต์ก๋๋ฅผ ์ํ ํ์ถ
}
}
console.log(acc); // ์ธ๋ถ API ํธ์ถ
}
10. ํจ์ํ์์ if ๋ฅผ ์ถ์ํ ํ๋ filter
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of list) {
if (a % 2) {
acc = acc + a * a;
if (++i == length)
break;
}
}
log(acc);
}
function *filter(f, list){
for(const a of list){
if(f(a)) yield a;
}
}
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of filter(a => a % 2, list))
{
acc = acc + a * a;
if (++i == length) break;
}
log(acc);
}
11. ํจ์ํ์์ ์ฐ์ฐ์ ์ถ์ํํ๋ map
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of filter(a
=> a % 2, list)) {
acc = acc + a * a;
if (++i == length)
break;
}
log(acc);
}
function *map(f, list){
for(const a of list){
yield f(a);
}
}
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of map(a => a * a ,
filter(a => a % 2, list)))
{
acc = acc + a;
if (++i == length) break;
}
log(acc);
}
12. take
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of map(a => a * a ,
filter(a => a % 2, list)))
{
acc = acc + a;
if (++i == length) break;
}
log(acc);
}
function take(length, iter){
let res = [];
for(const a of iter){
res.push(a);
if(res.length == length) return res;
}
return res;
}
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of take(length ,map(a => a * a ,
filter(a => a % 2, list))))
{
acc = acc + a;
}
log(acc);
}
13. reduce1
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of take(length ,map(a => a * a ,
filter(a => a % 2, list))))
{
acc = acc + a;
}
log(acc);
}
function reduce(f, acc, iter){
for(const a of iter){
acc = f(acc, a);
}
return acc;
}
function f(list, length) {
return reduce(
(acc, a) => acc + a,
0,
take(length ,map(a => a * a ,filter(a => a % 2, list)))
)
}
14. reduce2function f(list, length) {
return reduce(
(acc, a) => acc + a,
0,
take(length ,map(a => a * a ,filter(a => a % 2, list)))
)
}
const add = (a,b) => a + b;
const f = (list, length) =>
reduce(add, 0,
take(length ,
map(a => a * a,
filter(a => a % 2, list))));
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ฝ๋๋ค.
List ๋ฅผ a % 2 ๋ก filter ํ๊ณ
a * a ๋ก ๊ณฑํด์ mapping ํ๊ณ
Length ๋งํผ take ํด์
์ด๊น๊ฐ 0 ์๋ค add ํ๋ค.
15. go1
function reduce(f, acc, iter){
if(arguments.length == 2){
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for(const a of iter){
acc = f(acc, a);
}
return acc;
}
const go = (...as) => reduce((a, f) => f(a), as);
go( 10, a => a + 10, a => a + 1, console.log);
์ ๋ฌ๋๋ ํจ์๋ฅผ ์ฐจ๋ก๋๋ก ์คํํ๋ ํจ์.
์ฒ์ 10์ ๋ค์ ํจ์ a => a + 10 ์ ์ ๋ฌํ๊ณ
๊ทธ ๊ฒฐ๊ณผ๋ฅผ(10 + 10 = 20) ๋ค์ ํจ์์ ์ ๋ฌํ๋ค.
๊ทธ ๊ฒฐ๊ณผ (20 + 1 = 21) ์ ๋ค์ ํจ์ console.log ์ ์ ๋ฌํ์ฌ ํ๋ฆฐํธ ํ๋ค.
16. go2
const f2 = (list, length) => go(
list,
list => filter(a => a % 2, list),
list => map(a => a * a, list),
list => take(length, list),
list => reduce(add, 0, list)
);
const add = (a,b) => a + b;
const f = (list, length) =>
reduce(add, 0,
take(length ,
map(a => a * a,
filter(a => a % 2, list))));
๊ฑฐ๊พธ๋ก ์ฝ์ด์ผ ํด์ ๋ถํธํ๋ ๋ถ๋ถ์ด ์์์ ์๋๋ก ์ฝ์ ์ ์๊ฒ ๋์๋ค.
๋ํ ํจ์์ ์ค์ฒฉ์ด ์ฌํด์ ์ฝ๊ธฐ ๋ถํธํ๋ ๋ถ๋ถ์ด ์์ด์ก๋ค.
18. curry2 const filter = curry(
function *(f, list){
for(const a of list){
if(f(a)) yield a;
}
});
const reduce = curry(
function (f, acc, iter){
if(arguments.length == 2){
iter = acc[Symbol.iterator]();
acc = iter.next().value;
}
for(const a of iter){
acc = f(acc, a);
}
return acc;
});
const map = curry(
function *(f, list){
for(const a of list){
yield f(a);
}
});
const take = curry(
function (length, iter){
let res = [];
for(const a of iter){
res.push(a);
if(res.length == length) return res;
}
return res;
});
19. curry3
const add = (a,b) => a + b;
const f = (list, length) =>
go(list,
filter(a => a % 2),
map(a => a * a),
take(length),
reduce(add));
function f(list, length) {
let i = 0;
let acc = 0;
for (const a of list) {
if (a % 2) {
acc = acc + a * a;
if (++i == length) break;
}
}
log(acc);
}
BEFORE AFTER
20. Javascript es6์์ ์ง์ํ๋
map, filter, reduce
Array.prototype.take = function (length) {
return this.slice(0, length);
}
const add = (a,b) => a + b;
const f = (list, length) =>
list.filter(a => a % 2).
map(a => a * a).
take(length).
reduce(add);
take ๋ js ์์๋ ์๋ค.
const add = (a,b) => a + b;
const f = (list, length) =>
go(list,
filter(a => a % 2),
map(a => a * a),
take(length),
reduce(add));
21. ๋ค๋ฅธ FP ์ง์ ์ธ์ด ์์์
map, filter, reduce
fun f(list: MutableList<Int>, length: Int) =
list.filter { it % 2 != 0 }
.take(length)
.map { it * it }
.reduce { acc, i -> acc + i}
def f = (list: List[Int], length: Int) =>
list.filter((i: Int) => i % 2 != 0)
.take(length)
.map((i: Int) => i * i)
.reduce((acc: Int, a: Int) => acc + a)
์ฝํ๋ฆฐ ์ค์นผ๋ผ