SlideShare a Scribd company logo
Javascript ES6+
ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
๋ชฉ์ฐจ
โ€ข js es6+ ์—์„œ ๋‹ฌ๋ผ์ง„ ์ 
โ€ข ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
โ€ข ์ดํ„ฐ๋Ÿฌ๋ธ”/์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ
โ€ข ์ œ๋„ค๋ ˆ์ดํ„ฐ
โ€ข ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ
โ€ข ๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ ํ๋ฆ„
โ€ข ๋ช…๋ นํ˜•์„ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง
โ€ข map, filter, take, reduce, go, curry
๋ฆฌ์ŠคํŠธ ์ˆœํšŒ
โ€ข Es5โ€‹
โ€ข for(var i=0; i<length; i++){
โ€ข Items.foreach(function(item){...
โ€ข for(var key in iterable){ โ€ฆ
โ€ข ES6
โ€ข for(const value of iterable){โ€ฆ
Symbol.iterator ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?
iterable
โ€ข ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” [Symbol.iterator]() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ’
let arr = [1,2,3,4];
let iterator = arr[symbol.iterator]();
arr[symbol.iterator]
ฦ’ [Symbol.iterator]() { [native code] }
โ€ข Iterator ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ
โ€ข arr๋Š” iterable ์ด๋‹ค.โ€‹
iterator
โ€ข { value : v, done: Boolean } ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” next() ๋ฅผ ๊ฐ€์ง„ ๊ฐ’
const arr = [1,2];
const iter = arr[Symbol.iterator]();
log(iter.next()) // {value: 1, done: false}
log(iter.next()) // {value: 2, done: false}
log(iter.next()) // {value: undefined, done: true}
๏‚ง for(const value of iter) ๋Š” done ์ด true ์ผ ๋•Œ๊นŒ์ง€ iter ๋ฅผ ์ˆœํšŒํ•œ๋‹ค.
๏‚ง for(const value in iter) ์€ ๊ทธ๋Ÿฐ๊ฑฐ ์—†์Œโ€ฆ
iterable/iterater protocolโ€‹
โ€ข iterable์„ for..of, ์ „๊ฐœ ์—ฐ์‚ฐ์ž ๋“ฑ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋„๋ก ํ•œ ๊ทœ์•ฝ
โ€ข Array, Set, Map ์€ iterable/iterater protocol ์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
const arr = [1,2,3];
const arrIter = arr[Symbol.iterator]();
const map = new Map([ ['a', 1], ['b',2], ['c',3] ]);
const mapIter = map[Symbol.iterator]();
const set = new Set([1,2,3]);
const setIter = set[Symbol.iterator]();
Generator
Iterator ์ด์ž Iterable ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
function* gen() {
yield 1;
if (false) yield 2;
yield 3;
}
let iter = gen();
log(iter[Symbol.iterator]() == iter); // true
log(iter.next()); // {value: 1, done: false}
log(iter.next()); // {value: 3, done: false}
log(iter.next()); // {value: undefined, done: true}
๋ช…๋ นํ˜• ์ฝ”๋“œ์˜ ํ๋ฆ„
optA
optB1
optB2
optC optD
๋ฃจํ”„
์˜ˆ
์•„๋‹ˆ
์˜ค
optA optB optC optD
ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์˜ ํ๋ฆ„
์„ธ์ƒ ํ”ํ•œ ๋ช…๋ นํ˜• ์ฝ”๋“œ
// ๋ฆฌ์ŠคํŠธ์—์„œ ํ™€์ˆ˜๋ฅผ 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 ํ˜ธ์ถœ
}
ํ•จ์ˆ˜ํ˜•์—์„œ 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);
}
ํ•จ์ˆ˜ํ˜•์—์„œ ์—ฐ์‚ฐ์„ ์ถ”์ƒํ™”ํ•˜๋Š” 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);
}
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);
}
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)))
)
}
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 ํ•œ๋‹ค.
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 ์— ์ „๋‹ฌํ•˜์—ฌ ํ”„๋ฆฐํŠธ ํ•œ๋‹ค.
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))));
๊ฑฐ๊พธ๋กœ ์ฝ์–ด์•ผ ํ•ด์„œ ๋ถˆํŽธํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
๋˜ํ•œ ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์ด ์‹ฌํ•ด์„œ ์ฝ๊ธฐ ๋ถˆํŽธํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์—†์–ด์กŒ๋‹ค.
curry1
const curry = f => (a, ...bs) =>
bs.length? f(a, ...bs) : (...bs) => f(a, ...bs);
const add = curry((a,b) => a + b);
const add5 = add(5); // 5๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
const add10 = add(10); // 10์„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
log(add5(10)); // 15
log(add10(10)); // 20
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;
});
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
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));
๋‹ค๋ฅธ 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)
์ฝ”ํ‹€๋ฆฐ ์Šค์นผ๋ผ

More Related Content

Similar to Functional programming

Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungeescor7910
ย 
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
HyeonSeok Choi
ย 
2012 Dm C2 04
2012 Dm C2 042012 Dm C2 04
2012 Dm C2 04seonhyung
ย 
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซ
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ   แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซแ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ   แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซ
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซdaewon jeong
ย 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
Jaeseung Ha
ย 
Fp basic-kotlin
Fp basic-kotlinFp basic-kotlin
Fp basic-kotlin
Myeongin Woo
ย 
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
beom kyun choi
ย 
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
Jaeseung Ha
ย 
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
Kwang Yul Seo
ย 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfjinwookhong
ย 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdfkd19h
ย 
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋”” 3์ผ
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋””   3์ผ์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋””   3์ผ
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋”” 3์ผ
ByungSun Park
ย 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Ji Hun Kim
ย 
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
Booseol Shin
ย 
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracleTABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
์—‘์…ˆ
ย 
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ตJavascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
์ง€์ˆ˜ ์œค
ย 
DEVIEW-FULL-๊ฐ๋…ํŒ.pptx
DEVIEW-FULL-๊ฐ๋…ํŒ.pptxDEVIEW-FULL-๊ฐ๋…ํŒ.pptx
DEVIEW-FULL-๊ฐ๋…ํŒ.pptx
hanbeom Park
ย 
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
Circulus
ย 
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
JiandSon
ย 
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
Terry Cho
ย 

Similar to Functional programming (20)

Cpp 0x kimRyungee
Cpp 0x kimRyungeeCpp 0x kimRyungee
Cpp 0x kimRyungee
ย 
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
ํ•จ์ˆ˜์  ์‚ฌ๊ณ  2์žฅ
ย 
2012 Dm C2 04
2012 Dm C2 042012 Dm C2 04
2012 Dm C2 04
ย 
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซ
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ   แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซแ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ   แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซ
แ„‚แ…กแ„‹แ…ฆ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ แ„Œแ…ตแ„‹แ…ขแ†ซแ„‰แ…ฅแ†ซ
ย 
20150212 c++11 features used in crow
20150212 c++11 features used in crow20150212 c++11 features used in crow
20150212 c++11 features used in crow
ย 
Fp basic-kotlin
Fp basic-kotlinFp basic-kotlin
Fp basic-kotlin
ย 
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
์ž๋ฐ”8 ์ŠคํŠธ๋ฆผ API ์†Œ๊ฐœ
ย 
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
[NDC2015] C++11 ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ - Crow์— ์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ• ์ค‘์‹ฌ์œผ๋กœ
ย 
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž…๋ฌธ
ย 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
ย 
2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf2012 Dm A0 04 Pdf
2012 Dm A0 04 Pdf
ย 
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋”” 3์ผ
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋””   3์ผ์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋””   3์ผ
์ŠคํŠธ๋ฆผApi ์Šคํ„ฐ๋”” 3์ผ
ย 
Learning Node Book, Chapter 5
Learning Node Book, Chapter 5Learning Node Book, Chapter 5
Learning Node Book, Chapter 5
ย 
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
ํŒŒ์ด์ฌ2.7 ๊ธฐ์ดˆ ๊ณต๋ถ€ํ•œ ๊ฒƒ ์ •๋ฆฌ
ย 
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracleTABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
TABLE ACCESS ํŒจํ„ด์„ ์ด์šฉํ•œ SQL ํŠœ๋‹_Wh oracle
ย 
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ตJavascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
Javascriptแ„€แ…ขแ„‡แ…กแ†ฏแ„Œแ…กแ„‹แ…ด แ„‚แ…ฎแ†ซแ„‹แ…ณแ„…แ…ฉ python แ„ƒแ…ณแ†ฏแ„‹แ…งแ„ƒแ…กแ„‡แ…ฉแ„€แ…ต
ย 
DEVIEW-FULL-๊ฐ๋…ํŒ.pptx
DEVIEW-FULL-๊ฐ๋…ํŒ.pptxDEVIEW-FULL-๊ฐ๋…ํŒ.pptx
DEVIEW-FULL-๊ฐ๋…ํŒ.pptx
ย 
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
Startup JavaScript 6 - ํ•จ์ˆ˜, ์Šค์ฝ”ํ”„, ํด๋กœ์ €
ย 
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
2014.07.26 KSUG์™€ ์ง€์•ค์„ ์ด ํ•จ๊ป˜ํ•˜๋Š” ํ…Œํฌ๋‹ˆ์ปฌ ์„ธ๋ฏธ๋‚˜ - แ„‚แ…ก์˜ แ„Žแ…ฅแ†บแ„‡แ…ฅแ†ซแ„แ…ข แ„Œแ…กแ„‡แ…ก8 แ„…แ…กแ†ทแ„ƒแ…กแ„‰แ…ตแ†จ (์ •๋Œ€์›)
ย 
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
R ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ•
ย 

Functional programming

  • 2. ๋ชฉ์ฐจ โ€ข js es6+ ์—์„œ ๋‹ฌ๋ผ์ง„ ์  โ€ข ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ โ€ข ์ดํ„ฐ๋Ÿฌ๋ธ”/์ดํ„ฐ๋ ˆ์ดํ„ฐ ํ”„๋กœํ† ์ฝœ โ€ข ์ œ๋„ค๋ ˆ์ดํ„ฐ โ€ข ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ โ€ข ๋ช…๋ นํ˜•, ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ ํ๋ฆ„ โ€ข ๋ช…๋ นํ˜•์„ ํ•จ์ˆ˜ํ˜•์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง โ€ข map, filter, take, reduce, go, curry
  • 3. ๋ฆฌ์ŠคํŠธ ์ˆœํšŒ โ€ข Es5โ€‹ โ€ข for(var i=0; i<length; i++){ โ€ข Items.foreach(function(item){... โ€ข for(var key in iterable){ โ€ฆ โ€ข ES6 โ€ข for(const value of iterable){โ€ฆ Symbol.iterator ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๊ฐ€?
  • 4. iterable โ€ข ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” [Symbol.iterator]() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ’ let arr = [1,2,3,4]; let iterator = arr[symbol.iterator](); arr[symbol.iterator] ฦ’ [Symbol.iterator]() { [native code] } โ€ข Iterator ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฉ”์†Œ๋“œ โ€ข arr๋Š” iterable ์ด๋‹ค.โ€‹
  • 5. iterator โ€ข { value : v, done: Boolean } ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” next() ๋ฅผ ๊ฐ€์ง„ ๊ฐ’ const arr = [1,2]; const iter = arr[Symbol.iterator](); log(iter.next()) // {value: 1, done: false} log(iter.next()) // {value: 2, done: false} log(iter.next()) // {value: undefined, done: true} ๏‚ง for(const value of iter) ๋Š” done ์ด true ์ผ ๋•Œ๊นŒ์ง€ iter ๋ฅผ ์ˆœํšŒํ•œ๋‹ค. ๏‚ง for(const value in iter) ์€ ๊ทธ๋Ÿฐ๊ฑฐ ์—†์Œโ€ฆ
  • 6. iterable/iterater protocolโ€‹ โ€ข iterable์„ for..of, ์ „๊ฐœ ์—ฐ์‚ฐ์ž ๋“ฑ๊ณผ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋„๋ก ํ•œ ๊ทœ์•ฝ โ€ข Array, Set, Map ์€ iterable/iterater protocol ์„ ๋”ฐ๋ฅธ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. const arr = [1,2,3]; const arrIter = arr[Symbol.iterator](); const map = new Map([ ['a', 1], ['b',2], ['c',3] ]); const mapIter = map[Symbol.iterator](); const set = new Set([1,2,3]); const setIter = set[Symbol.iterator]();
  • 7. Generator Iterator ์ด์ž Iterable ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜ function* gen() { yield 1; if (false) yield 2; yield 3; } let iter = gen(); log(iter[Symbol.iterator]() == iter); // true log(iter.next()); // {value: 1, done: false} log(iter.next()); // {value: 3, done: false} log(iter.next()); // {value: undefined, done: true}
  • 8. ๋ช…๋ นํ˜• ์ฝ”๋“œ์˜ ํ๋ฆ„ optA optB1 optB2 optC optD ๋ฃจํ”„ ์˜ˆ ์•„๋‹ˆ ์˜ค optA optB optC optD ํ•จ์ˆ˜ํ˜• ์ฝ”๋“œ์˜ ํ๋ฆ„
  • 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)))); ๊ฑฐ๊พธ๋กœ ์ฝ์–ด์•ผ ํ•ด์„œ ๋ถˆํŽธํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ํ•จ์ˆ˜์˜ ์ค‘์ฒฉ์ด ์‹ฌํ•ด์„œ ์ฝ๊ธฐ ๋ถˆํŽธํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์—†์–ด์กŒ๋‹ค.
  • 17. curry1 const curry = f => (a, ...bs) => bs.length? f(a, ...bs) : (...bs) => f(a, ...bs); const add = curry((a,b) => a + b); const add5 = add(5); // 5๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. const add10 = add(10); // 10์„ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. log(add5(10)); // 15 log(add10(10)); // 20
  • 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) ์ฝ”ํ‹€๋ฆฐ ์Šค์นผ๋ผ