inflearn logo
강의

Course

Instructor

Functional Programming and JavaScript ES6+

L.flatMap, flatMap

L.flatMap 에러 질문

375

easyiscat

12 asked

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이 아니라고 에러 반환을
하는데, 문제가 무엇인지 모르겠습니다..
 
 
*/

javascript 함수형-프로그래밍

Answer 2

2

Dongmin Kim

강사님 강의에서 pipe를 두가지 버전으로 알려주시고 두번째 버전으로 사용하신걸 못보고 두가지를 따로 쓰고 있었네요 ㅎㅎ 같은 에러 나서 찾다가 봤습니다

1

mduniv

어디서 인자가 안들어오는지 확인해보세요 :)

1

easyiscat

겨우 찾았습니다.

 

pipe를 

const pipe =
(...fn) =>
(args) =>
go(args, ...fn);

 

이므로, go(map(a => a * a), L.map,L.flatten)이 된다.
여기서 문제가 발생했던 것 같습니다,, ㅜㅜ
 
pipe 함수를 인자가 2개 이상 받을 경우로 수정해주어
 
const pipe =
(f, ...fs) =>
(...args) =>
go(f(...args), ...fs);
와 같이 수정하게되면

pipe(L.map,L.flatten)(map(a => a * a),[[1, 2],[3, 4],[5, 6, 7]]) 함수는

go(
L.map(
map(a => a * a),
[[1, 2],[3, 4],[5, 6, 7]]
),
L.flatten
)
 
로 적용이 되어 에러가 발생하지 않았습니다,, ㅎㅎ,, 더 학습할 수 있는 계기가 되었네요 감사합니다!

0

easyiscat

L.map이 인자를 f와 iter를 받기 때문에  평소 예제 코드를 타이핑할때 

go(

iter,

L.map(a => a)

)

 

이런식으로 하다보니 많이 착각했던 것 같습니다 ,, ㅜㅜ

신기하고,, 성장한거 같아서 매우 뿌듯합니다 ㅎㅎ 감사합니다!!

0

mduniv

크크 화이팅!!

0

easyiscat

안녕하세요 개발자님,

 

개발 중 궁금중이 있어 질문드립니다.

 

const test = (idx) => () => handleTestEvent(idx)와 같은 함수가 있을경우

useCallback 함수 적용을 어떻게 해줄 수 있나요??

 

중첩함수에서 useCallback을 어떻게 써야하나 의문이 풀리질 않아서요,

 

프론트엔드 실무에서 어떤때에 쓰이는지 궁금합니다

1

111

1

함수형 프로그래밍 심화 강의 자료 추천

0

72

2

함수형 자바스크립트 프로그래밍 책

0

54

1

filter가 아무것도 걸러내지 못하는 경우

0

114

1

take 함수의 성능적면에서의 이점

1

463

1

pipe함수

1

531

1

Identity 함수

0

450

1

함수형 프로그래밍이란

0

832

1

reduce 예제 코드 제안!

0

405

1

fxts를 배워보려고 합니다.

1

537

1

flatMap 관련 질문드립니다~

1

444

1

다용성이 높은 L.flatMap

0

358

1

변수에 재 할당 금지~

0

540

1

DevTools라고 옆에 결과 확인하는거 어떻게 하나요?

0

483

2

소요시간에 관해서 질문드립니다

1

458

1

join에 대한 내용이 궁금증이 해결되지 않아서 질문드립니다!

0

465

2

reduce에 L.range를 사용할 때

0

527

2

[이해내용 공유] Lazy 에서 C.reduce가 병렬 효과를 내는 이유

3

739

2

제가 이해한 C.Reduce와 Reduce의 동작 차이 정리

2

787

3

go, pipe 함수 관련하여 질문 드립니다.

1

499

1

안녕하세요 강사님!

0

380

2

fxts에 go가 없는 이유?

0

840

1

비동기 관련 질문입니다!

0

462

1

질문 있습니다.

0

517

1