55,000원
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨함수형 프로그래밍과 JavaScript ES6+
안녕하세요 질문 있습니다.
강의에서는 체크 박스가 체크된 아이템을 is_selected로 구분해서 추려낸 다음 총 합계와 총 가격을 표시해줬습니다.그런데 어쨌든 체크된 아이템을 총 2번 순회하게 된다는건데 이렇게 하지 않고 두 아이템을 배열이나 키가 있는 객체에 함께 담아서 리턴하는 식으로 데이터를 다루는건 별로일까요??이렇게 되면 map을 사용해서 특정 데이터를 뽑아내지 않고 reduce를 통해서 데이터의 전체 값을 가지고 있어야 할거 같은데 그럼 오히려 수량을 계산하는 보조함수와 가격을 계산하는 보조함수가 묶이게 돼 안좋게 되나 싶어서 궁금합니다.또는 아직 안배운 다른 방법이 있어서 일단 강의를 들으면 될지도 궁금합니다. 감사합니다. 강의가 너무 재밌네요.
- 미해결함수형 프로그래밍과 JavaScript ES6+
로직 질문
6분20초 쯤에if (a == l) return; 을 지우셨는데이걸 안지워도 결과가 똑같던데 무슨 차인가요??그리고 infinity(i = 0) 이렇게 되어있으면 36번째 라인에 infinity(1)은 의미가 없지 않나요?
- 미해결함수형 프로그래밍과 JavaScript ES6+
병렬평가 질문 있습니다!
C.reduce = curry((f, acc, iter) => { log([...acc]); return iter ? reduce(f, acc, catchNoop(iter)) : reduce(f, catchNoop(acc)); });reduce에 acc를 전개연산자로 펼쳐서 전달하지 않고 이전에 하게 되면 저렇게 iterable의 값이 모두 소비된 상태로 전달 되기 때문에 reduce의 값이 undefined로 평가 되는 것일까요...?
- 미해결함수형 프로그래밍과 JavaScript ES6+
함수를 분리하지 않고 실행하게 되면 순환참조 오류가 발생합니다...
const reduce = curry((f, acc, iter) => { if (!iter) return reduce(f, head((iter = acc[Symbol.iterator]())), iter); iter = iter[Symbol.iterator](); return go1(acc, function recur(acc) { let cur; while (!(cur = iter.next()).done) { /* acc = reduceF(acc, cur.value, f); */ const a = cur.value; acc = a instanceof Promise ? a.then( (a) => f(acc, a), (e) => (e === nop ? acc : Promise.reject(e)) ) : f(acc, a); if (acc instanceof Promise) return acc.then(recur); } return acc; }); });이렇게 실행하면Uncaught (in promise) TypeError: Chaining cycle detected for promise #<Promise>위와 같이 순환참조 오류가 발생하는데 이렇게 발생하는 이유가 아래와 같은 순서로 인해 발생하는게 맞는지 확인좀 부탁드립니다...acc에 a.then메서드가 호출된 결과로 이때 pending 상태의 Promise 객체가 할당됨 a.then메서드의 콜백함수가 실행되며 1번의 pending상태의 Promise객체가 리턴 pending상태이기 때문에 settled상태가 아니며 프로미스 체이닝이 불가능 하고 프로미스를 사용 할 수 없는 무한정 대기상태에 빠짐 프로미스 다루는게 무진장 어렵다는것을 한 강의 한 강의 마다 느낍니다...
- 미해결함수형 프로그래밍과 JavaScript ES6+
rxjs 와 차이점
학습잘 듣고 있습니다.듣다가 궁금한것이 rxjs 와 fstx 와의 차이가 컨셉이 비슷한 부분이 많다는 느낌이 받습니다.rxjs 와 fstx 를 결합해서 사용도 해도 될 듯 보입니다.rxjs 와 fstx 의 개념적으로나 사용적인 면에서 차이가 뭔지 궁금합니다.
- 미해결함수형 프로그래밍과 JavaScript ES6+
return 있고 없고 차이 질문드립니다...!
const reduce = curry((f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } else { iter = iter[Symbol.iterator](); } return (function recur(acc) { let cur; while (!(cur = iter.next()).done) { const a = cur.value; acc = f(acc, a); if (acc instanceof Promise) acc.then(recur); } return acc; })(acc); }); const go = (...args) => reduce((a, f) => f(a), args); go( 1, (n) => Promise.resolve(n + 10), (n) => n + 100, log );위와 같이 acc.then을 리턴하지 않는 경우 log에 값이 깨져 보여서 설연휴 동안 계속 왜이런지 고민해서 내린 답인데 글이 길지만 한번 제가 내린답이 맞는지 틀렸다면 어디부분이 잘못됐는지 확인좀 부탁드립니다...! 길어서 댓글로 남기겠습니다.
- 미해결함수형 프로그래밍과 JavaScript ES6+
reduce 함수 질문입니다!
강의 잘 듣고 있습니다. 항상 파이팅 입니다!이 강의에서 만든 Reduce 함수 궁금한 점이 있습니다. 이터러블 프로토콜을 활용해 배열의 첫번째 값을 초기값으로 설정 할 수 있는 것 까지는 알겠습니다. 기존 Array.prototype.reduce 에서는 초기값을 설정 할 수 있는데...arr.reduce((acc, cur) => blabla, {}) 요런 식으로빈 객체나 배열을 통해 새로운 객체나 배열을 만들 수 있는데이터러블 프로토콜을 활용해 만든 함수 reduce는 방법이 없나요제가 사용을 못하는 것일까요?? 방법이 있다면 어떤 방식으로 사용해야 할까요???
- 미해결함수형 프로그래밍과 JavaScript ES6+
클레이슬리 컴포지션 질문있습니다...
클레이슬리 컴포지션이 결국 일반적인 코드에서 자주 사용되는 async/await 의 try/catch 혹은 Promise를 직접사용하여 체이닝 후 catch를 하는 에러핸들링과 비슷하게 생각하면 될까요...??
- 미해결함수형 프로그래밍과 JavaScript ES6+
중간에 Promise가 있을때, 성능저하가 일어난다는 부분이 이해가 어렵습니다.
수업 내용 코드를 캡쳐해왔는데요.최초에 promise가 동작하도록 아래와 같이 코드 작성을 하셨고, 아래 코드는 위 코드에서 Promise.resolve(a+100)이후에 Promise chain을 타게 되어, 연속적으로 비동기가 일어나며 성능저하가 일어난다고 하셨는데요.Promise.resolve(a+100) 이후 acc에 할당되는 값이 acc.then(acc => f(acc,a));가 되다 보니까 결국acc.then(acc => f(acc,a)).then(acc => f(acc,a)).then...then...;위와 같이 계속 thenable 하게 chaining이 되고,그 결과 promise는 microstack 이기 때문에 microstack queue <-> callstack 사이에 task 이동으로 인해 부하가 생겨 성능 저하가 발생한다.하지만 코드 내에 호출되는 일반 함수의 경우 callstack에 바로 호출되기 때문에, 유명함수를 가진 함수로 리팩터링하신 것 같은데위와 같이 이해한 게 맞을까요?
- 해결됨함수형 프로그래밍과 JavaScript ES6+
function chaining 시, performance 이슈는 없나요?
예를 들면 for loop를 돌면서 그 내부에 로직을 잘 작성하여, filter, map과 같은 함수 없이도 코딩을 할 수는 있잖아요. 위 처럼 for loop를 한번 돌아 처리하는 상황과 go, lodash의 flow과 같이 chaining을 통해 처리하는 상황과 시간복잡도는 같기 때문에 수행 속도에 큰 차이는 없어보이긴 하는데요. function chaining을 많이 하여도 실제로 performance에 영향을 줄 정도로 느려지거나 그러진 않나요? 뭐 함수 call 비용이나... 그런 부분들 때문에요! 답변 주시면 감사하겠습니다.
- 미해결함수형 프로그래밍과 JavaScript ES6+
배열에서 몇개만 취득하는 것이 아닐 경우
안녕하세요, 강사님 :)강의내용에서 age<20, take(3) 처럼 3개만 뽑는 경우엔 지연성으로 인해 3개만 뽑고 뒤에 배열들은 탐색하지 않겠지만 age<20의 사용자를 모두 뽑는 경우엔 이렇게 지연성으로 하나 일반 map,filter를 사용하나 성능상에 차이가 없는 것이죠?
- 미해결함수형 프로그래밍과 JavaScript ES6+
평가 순서에 대해 질문이 있습니다!
안녕하세요. 먼저 좋은 강의와 항상 빠르게 답변을 해주셔서 너무 감사합니다. 질문은 아래와 같습니다.지연성 1 파트에 있는 평가순서 강의를 복습하면서 클레이슬리 컴포지션의 평가 순서를 생각해보았는데, 제 생각이 맞는지 궁금합니다. 예시코드// gogo( [1, 2, 3, 4, 5], L.map((n) => Promise.resolve(n)), L.filter((n) => n % 2), take(2), console.log // [1, 3] ); // takeexport const take = curry((l, iter) => { let result = []; iter = iter[Symbol.iterator](); // recur()가 실행되면, 여기서 다시 시작을 하는데. // iter.next()가 실행되면, return (function recur() { let cur; while (!(cur = iter.next()).done) { const value = cur.value; // a가 promise 인 경우 재귀함수를 이용해서 처리함 if (value instanceof Promise) return ( value // .then((v) => (result.push(v), result).length === l ? result : recur() ) // filter에서 reject가 되면, catch에 걸리고 e가 nop이면 recur()를 실행한다. .catch((e) => (e === nop ? recur() : Promise.reject(e))) ); result.push(value); if (result.length === l) return result; } return result; })(); });// L.filterconst nop = Symbol("nop"); export const L.filter = curry(function* (f, iter) { for (const a of iter) { const b = go1(a, f); if (b instanceof Promise) yield b.then((b) => (b ? a : Promise.reject(nop))); else if (b) yield a; } });// L.mapexport const L.Map = curry(function* (f, iter) { for (const el of iter) { yield go1(el, f); } }); 평가 순서take 함수 내, iter.next() 평가를 시도 → L.filter로 이동L.filter 내, iter.next() 평가를 시도 → L.map 으로 이동L.map 내, inter.next() 평가를 시도한다. → [1, 2, 3..] 를 iter 로 받았기 때문에 1로 평가 된다.L.filter 로 돌아와, L.map으로부터 평가받은 Promise.resolve(1) 이라는 값(b)으로 내부 로직을 수행한다.b의 인스턴스가 Promise라면, b.then을 실행하고 a 또는 Promise.reject을 한다.여기서 a는 Promise 이다.b의 인스턴스가 Promise가 아니라면, result.push(value); 을 실행하고 while로 순회한다.L.filter 의 평가가 끝나면 take 함수로 돌아온다take로 전해지는 L.filter 의 평가값은 4개 중에 하나일 것이다.a → take 내에서 result.push 가 실행됨Promise.resolve(a) → take 내에서 .then 절이 실행됨.Promise.reject(nop) → take 내에서 .catch 절이 실행되고 recur() 를 실행함Promise.reject(e) → take 내에서 .catch절이 실행되고, Promise.reject(e) 로 이어짐recur()가 실행되면, take 에서 실행된 첫번째 while 사이클이 끝나면서, 다시 recur()가 실행되며 iter.next()가 평가할때 위 과정을 다시 반복한다. take에 있는 while 사이클이 return되고 recur() 함수 실행이 종료됐음에도 iter.next()의 값이 이전값에서 이어지는 이유는 recur() 와 iter가 클로저이기때문이다.
- 미해결함수형 프로그래밍과 JavaScript ES6+
reduce 리팩토링 과정에서 질문이 있습니다.
go(1, a => a + 1, a => Promise.resolve(a + 10) a => a + 100, a => a + 1000, )5:49 부분에서 "즉시 하나의 콜스택에서 실행되기를 바랬다면" 이라는 말의 자세한 설명을 부탁드려도 될까요?
- 미해결함수형 프로그래밍과 JavaScript ES6+
3차원 배열, 4차원 배열
2차원 배열일 경우에는 L.flatten 코드로 가능하지만 3차원 배열, 4차원 배열일 경우엔 어떻게 구현해야 좋을까요?아래와 같이 구현할려고하니 deepFlatten을 해결해주는 곳이 없어서 3차원 배열 이상은 이터레이터로 리턴받고 있습니다.ㅠㅠconst isIterable = a => a && a[Symbol.iterator]; function* deepFlatten(iter){ for(const a of iter){ if (isIterable(a)) yield deepFlatten(a) else yield a; } } L.flatten = function* (iter) { for (const a of iter) { if (isIterable(a)) yield deepFlatten(a) else yield a; } }; var it = L.flatten([[1, [1,2,3]], 3, 4, [5, 6], [7, 8, 9]]); log(take(Infinity, it))[deepFlatten, 3, 4, deepFlatten, deepFlatten]
- 미해결함수형 프로그래밍과 JavaScript ES6+
이해를 해보려고 하다 막혀서 질문 드립니다...!
후반에 products가 축약되는 것이 이해가 안되어 계속 돌려보다 제 나름대로 이해 해서 적어봅니다... 커리함수로 감싼 함수에 인자 하나를 전달하여 즉시실행 하지 않고 함수를 반환하도록 함 반한된 함수는 콜백함수로 go함수에 전달 됨 따라서 반환된 함수의 실행 시점과 인자는 go함수에게 위임됨 go함수 의 정의된 내용에 따라 실행되며 반환된 함수에 products값을 인자로 넘겨 실행 결국 go함수의 입장에서 보면 (products) => curry(filter)((p) => p.price < 20000)(products) === curry(filter)((p) => p.price < 20000) 5번 까지의 과정으로 인해 축약 가능 이렇게 위와같은 순서로 이해를 했습니다... 혹시 틀린 부분이 있다면 알려주시면 감사하겠습니다!
- 미해결함수형 프로그래밍과 JavaScript ES6+
함수형 프로그래밍
함수형 프로그래밍을 공부를 하면서 매번 놀랍고, 신기해 하면서 즐겁게 공부를 하고 있습니다근데 너무 어려운거 같은데.. 계속 반복학습을 하다 보면 자연스레 습득이 되겠죠..?? 아 그리고 책으로도 출판을 하셨던데 강의와 책을 같이 보면서 하면 도움이 많이 될까요??
- 미해결함수형 프로그래밍과 JavaScript ES6+
well-formed-iterator 질문드립니다.
well-formed-iterator의 개념적 정의는 이해하였습니다. 근데 이걸 왜 구현해야하는지 에 대한 의문이 남아 개인적으로 아래와 같이 정리해보았습니다.이터러블/이터레이터 프로토콜을 따르는 어떤 값이 어디서 혹은 어떤 시점에 사용이 되던 가장 마지막 next 메소드를 호출한 이후 상태를 유지하기 위함혹시 위 내용에서 틀린 부분이라던가 혹은 또 다른 이유가 있을까 해서 질문남깁니다...!
- 미해결함수형 프로그래밍과 JavaScript ES6+
[수업에서 벗어난 질문.. ] reduce 를 타입스크립트에서 구현한다면..
다소 외람된 질문입니다만 혼자서 고민하다가.. 이경우에는 어떻게 타입을 설정해야할지.. 궁금하여 질문을 드립니다..export const reduce = <T, F>( f: (acc: F, a: T) => F, acc: F, iter: Iterable<T> ): F => { // if (!iter) { // iter = acc[Symbol.iterator](); // acc = iter.next().value; // } for (const el of iter) { acc = f(acc, el); } return acc; };iter가 !iter 일때.. acc의 타입이 F 이기때문에 [Symbol.iterator]()를 찾지 못하는데.. 이런경우에는 어떻게 하면 좋을까요.. 수업에서 벗어나는 타입스크립트라서 답변을 주시지 않아도 괜찮습니다. 감사합니다.
- 미해결함수형 프로그래밍과 JavaScript ES6+
filter 에서의 보조함수 f(a) 질문드립니다.
const filter = (f,products) =>{ let res = [] for (const a of products){ if(f(a)) res.push(a) } return res } 해당 부분 에서 a가 정확하게 궁금합니다. f(a) 는 f의 실행 결과 retrun 값인가요? 그게 맞다면 filter인자 첫번째 f는 function(p){return p.price} 이고 a 는 p.price 라고 보는게 맞겠죠?
- 미해결함수형 프로그래밍과 JavaScript ES6+
flatMap 관련 질문입니다.
const flatMap1 = pipe(L.flatMap, takeAll); const flatMap2 = curry(pipe(L.map, L.flatten, takeAll)); const flatMap3 = curry(pipe(L.flatMap, flatten)); //인자를 그대로 전달해주면 가능한데 // 또 다른 연산을 수행하면 오류남 log( flatMap1( (a) => a * a, [ [1, 2], [3, 4], [5, 6, 7], ] ) );log 찍을 때 인자를 그대로 전달하면 오류는 안 나는데 위처럼 하니까 NaN이 뜨더라구요그래서 map(a=>a*a) 이렇게 처리해서 해결은 했는데 혹시 다른 방법이 있을까요?