inflearn logo
강의

Course

Instructor

Functional Programming and JavaScript ES6+

L.flatMap, flatMap

flatMap 관련 질문드립니다~

444

작성자 없음

0 asked

1

안녕하세요 선생님~~

지금까지 모르는거 있어도 그냥 계속 반복해서 보고, log 찍어보면서 해결했는데

flatMap 부분에서 도저히 이해 안 가는 부분이 있어서 이렇게 질문드립니다 ㅠㅠ.. 

우선 왜 map을 먼저하는지 모르겠습니다..

중첩배열을 먼저 평탄화 시켜주고 그 다음 map을 했을때에는 예상치 못한 결과나 에러가 발생하지 않았는데요.

map을 먼저 하게 되면 중첩 배열을 받아서 전달된 함수를 실행하는 부분에서 계속 결과값이 이상해 집니다... ㅠㅠ

사실 당연한 결과인데 map이든 L.map이든 [1,2,[3,4],[5]] 이런 중첩배열을 받아서 순회를 하고

a => a+10 이런 함수를 실행하면 당연히 결과 값이 이상해지는데 선생님 코드에서는 어떻게 제대로 작동 되는 건지 궁금합니다...;;

만약 L.flatMap(a => a, [1, 2, [3, 4], [5]]) 이런식으로 하면 그냥 a를 반환만 하니까 중첩배열이 반환 되고 L.flatten 에서 평탄화 되니까 별문제 없는데 a =>a +10 이런식의 함수를 넘겨주면 결과값이 이상해집니다...ㅠ 

뭐가 문제 인지 힌트 부탁드립니다~ 

const curry = fn => (a, ...args) => args.length ? fn(a, ...args) : (...args) => fn(a, ...args);





const reduce = (fn, iter, acc) => {
    if (!acc) {
        iter = iter[Symbol.iterator]();
        acc = iter.next().value;
    }

    for (const a of iter) {
        acc = fn(acc, a);
    }
    return acc;
}







const L = {};


L.map = curry(function* (fn, iter) {
    for (const a of iter) {
        yield fn(a)
    }
});



const isIterable = (a) => a && a[Symbol.iterator]

L.flatten = function* (iter) {

    for (const a of iter) {
        if (isIterable(a)) {
            yield* a
        } else yield a
    }
}




const map = curry((fn, iter) => {
    const res = [];
    for (const a of iter)
        res.push(fn(a))
    return res;
})






const take = curry((limit, iter) => {
    const res = [];
    for (const a of iter) {
        res.push(a)
        if (res.length === limit) return res;
    }
    return res;
});





const go = (...args) => reduce((a, fn) => fn(a), args);

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



// L.flatMap

L.flatMap = curry(pipe(
    L.map,
    L.flatten
));

const iter = L.flatMap(a => a + 10, [1, 2, [3, 4], [5]])

console.log(...iter) // 결과값 11 12 3 , 4 1 0 5 1 0




javascript 함수형-프로그래밍

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요. flatMap에 관한 질문이군요.

우선 flatMap은 배열을 평탄화(flatten)한 후, 각 요소에 함수를 적용하여 새로운 배열을 만드는 함수입니다. flatMap을 사용하면 중첩 배열을 평탄화한 후 함수를 적용할 수 있어요.

map과 flatMap의 차이는 map은 배열의 각 요소에 함수를 적용하여 새로운 배열을 반환하지만, flatMap은 평탄화한 후에 함수를 적용하고 새로운 배열을 반환합니다.

제가 이해한 바로는, 작성자가 flatMap을 사용할 때 map을 먼저 사용해서 이상한 결과가 나오지 않는 이유에 대한 질문이신 것 같아요. 그러나 작성자의 코드나 적용한 함수 등의 내용을 확인할 수 없어 정확한 답변을 드리기는 어렵습니다.

flatMap은 중첩 배열을 평탄화한 후 함수를 적용하기 때문에, 제대로 작동하려면 이러한 순서를 지켜야 합니다. 평탄화되기 전에 함수가 적용되면 원하는 대로 작동하지 않을 수 있습니다.

만약 flatMap에 함수를 적용해서 원하는 결과가 나오지 않는다면, 함수 적용 순서를 확인해보시고 평탄화되기 전에 함수가 적용되는지 확인해보세요. 그리고 flatMap의 사용법이나 예제를 참고하시면 더욱 이해하기 쉬울 것입니다.

더 자세한 내용이나 코드를 공유해주시면 더욱 도움을 드릴 수 있을 것 같아요. 감사합니다.

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

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

다용성이 높은 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

강의 중 혼란스러운 부분이 생겨 질문 드립니다.

0

546

2