인프런 커뮤니티 질문&답변
L.flatMap 에러 질문
작성
·
359
0
안녕하세요, 강의를 들으면서 코드 작성하는 도중 에러가 발생하여, 찾아보다 잘 모르겠어서 질문드리게 되었습니다.
코드 질문을 이렇게 드려도 되는지 모르겠습니다.
수정해서 질문을 올려야할 부분이 있다면, 말씀주시는대로 수정하여 질문을 다시 작성하겠습니다.
감사합니다!
L.flatMap = curry(pipe(L.map, L.flatten));
let iter = L.flatMap(
(a) => a,
[
[1, 2],
[3, 4],
[5, 6, 7],
]
);
console.log(iter.next());
// error L.flatten에서 iter is not iterable
// L.map 에서 제대로 실행이 안된다고 판단
// iter 변수의 값을 펼쳐서 생각해봄
/**
 *
 L.flatMap(
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
);
함수는 아래와 같다.
curry(
 pipe(
 L.map, 
 L.flatten
 )
 )(
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
 )
)
--- 
curry 함수는 
const curry =
 (f) =>
 (fn, ...iter) =>
 iter.length ? f(fn, ...iter) : (...args) => f(fn, ...args);
 이기 때문에,
 위 코드는 아래와 같다.
 pipe(
 L.map, 
 L.flatten
 )
 )(
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
 )
 ---
 pipe 함수는
const pipe =
 (...fn) =>
 (args) =>
 go(args, ...fn);
 이기 때문에,
 위 코드는 아래와 같다.
 go(
 (
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
 ),
 L.map,
 L.flatten
 )
 ---
 go 함수는
 const go = (...args) => reduce((a, f) => f(a), args);
 이기 때문에, 위 코드는 아래와 같다.
 reduce((a,f) => f(a), (
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
 ),
 L.map,
 L.flatten
 )
 ---
 reduce 함수는
 const reduce = curry((f, acc, iter) => {
 if (!iter) {
 iter = acc[Symbol.iterator]();
 acc = iter.next().value;
 }
 for (const a of iter) {
 acc = f(acc, a);
 }
 return acc;
 });
 이므로, 
 acc은 (
 (a) => a,
 [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ]
 )
 이며,
 iter 는 [ L.map , L.flatten ] 이다.
 여기서 제가 생각한 문제는 
 L.map에서 f로는 a => a , iter = [
 [1, 2],
 [3, 4],
 [5, 6, 7],
 ] 를 받아서 iter를 그대로 반환해야 한다고 생각합니다.
 하지만, L.flatten에서 받아온 iter는 iterable이 아니라고 에러 반환을
 하는데, 문제가 무엇인지 모르겠습니다..
 */
답변 2
2
1

easyiscat
질문자
L.map이 인자를 f와 iter를 받기 때문에 평소 예제 코드를 타이핑할때
go(
iter,
L.map(a => a)
)
이런식으로 하다보니 많이 착각했던 것 같습니다 ,, ㅜㅜ
신기하고,, 성장한거 같아서 매우 뿌듯합니다 ㅎㅎ 감사합니다!!

easyiscat
질문자
안녕하세요 개발자님,
개발 중 궁금중이 있어 질문드립니다.
const test = (idx) => () => handleTestEvent(idx)와 같은 함수가 있을경우
useCallback 함수 적용을 어떻게 해줄 수 있나요??
중첩함수에서 useCallback을 어떻게 써야하나 의문이 풀리질 않아서요,







겨우 찾았습니다.
pipe를