강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của easyiscat2273
easyiscat2273

câu hỏi đã được viết

Lập trình hàm và JavaScript ES6+

L.flatMap, FlatMap

L.flatMap 에러 질문

Viết

·

367

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함수형-프로그래밍

Câu trả lời 2

2

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

1

mduniv님의 프로필 이미지
mduniv
Người chia sẻ kiến thức

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

easyiscat님의 프로필 이미지
easyiscat
Người đặt câu hỏi

겨우 찾았습니다.

 

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
)
 
로 적용이 되어 에러가 발생하지 않았습니다,, ㅎㅎ,, 더 학습할 수 있는 계기가 되었네요 감사합니다!
easyiscat님의 프로필 이미지
easyiscat
Người đặt câu hỏi

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

go(

iter,

L.map(a => a)

)

 

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

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

mduniv님의 프로필 이미지
mduniv
Người chia sẻ kiến thức

크크 화이팅!!

easyiscat님의 프로필 이미지
easyiscat
Người đặt câu hỏi

안녕하세요 개발자님,

 

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

 

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

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

 

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

 

Hình ảnh hồ sơ của easyiscat2273
easyiscat2273

câu hỏi đã được viết

Đặt câu hỏi