inflearn logo
강의

Course

Instructor

Functional Programming and JavaScript ES6+

join function more polymorphic than Array.prototype.join

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

Resolved

465

projectkmscom

2 asked

0

const join = curry((seperator = ",", iter) =>
  reduce((a, b) => `${a}${seperator}${b}`, iter)
);

function* a(){
  yield 10;
  yield 11;
  yield 12;
  yield 13;
}

강의 중 작성하신 join 함수는 이렇게 돼있는데

log(join(a())) 이렇게 했을 경우 [function (anonymous)] 가 출력이 됩니다

array.prototype.join() 처럼 파라미터를 주지 않았을 때 기본으로 ',' 가 되게 하려면 다른 방식으로 join 함수를 선언해야하나요?

혼자 생각해봤을 땐 log(join(a())()); 이렇게 했을 경우와 log(join(undefined,a()))) 이렇게 했을 경우 default parameter인 쉼표로 join이 됐는데 log(join(a())) 로 했을 때에도 기본 파라미터를 활용할 수 있는 방법이 궁금합니다..!

javascript 함수형-프로그래밍

Answer 2

1

mduniv

curry 함수를 통해 1개의 인자만 전달할 경우 함수를 리턴하도록 구현되어있어서, log(join(a())) 이 방식으로는 어렵습니다 :)

0

communityai8509

안녕하세요, 인프런 AI 인턴이에요.

join 함수를 보면 파라미터로 separatoriter를 받습니다. separator는 기본값으로 쉼표(,)가 설정되어 있습니다. 하지만 join(a())와 같이 사용할 경우 [function (anonymous)]가 출력됩니다.

join(a())a()의 반환값이 아니라 a() 자체를 전달한 것이기 때문에 join 함수 내에서 iter로 전달되는 값은 function* a() 함수 자체입니다. 따라서, reduce 함수에서 iter를 문자열로 변환하기 전에 iter가 호출 가능한 함수인지 확인하여 호출한 후에 문자열로 변환해야 합니다.

아래는 위 내용을 반영한 join 함수 예시입니다.

const join = curry((separator = ",", iter) => {
  if (typeof iter === "function") {
    iter = iter();
  }
  return reduce((a, b) => `${a}${separator}${b}`, iter);
});

function* a(){
  yield 10;
  yield 11;
  yield 12;
  yield 13;
}

console.log(join(a())); // 10,11,12,13
console.log(join(undefined, a())); // 10,11,12,13

위 예시에서 join(a())join(undefined, a()) 모두 10,11,12,13을 출력합니다.

자세한 내용은 강의에서 다루는 내용과 관련이 있는데요, 강의를 들으시면 더 자세한 정보를 얻을 수 있을 것입니다.

그럼 궁금한 점이 해결되었으면 좋겠네요. 추가로 질문이 있다면 언제든지 물어보세요. 좋은 하루 되세요!

0

projectkmscom

함수형 프로그래밍에 대한 이해가 부족한건지.... 너무 여럽네요ㅠ

제가 사용한 curry 함수와 reduce 함수입니다

const curry =
  (f) =>
  (a, ..._) =>
    _.length ? f(a, ..._) : (..._) => f(a, ..._);

const reduce = curry((func, acc, iter) => {
  if (!iter) {
    iter = acc[Symbol.iterator]();
    acc = iter.next().value;
  }
  for (const i of iter) {
    acc = func(acc, i);
  }
  return acc;
});

join 함수를 다음과같이 선언하고

const join = curry((seperator = ",", iter) => {
  if (typeof iter === "function") {
    iter = iter();
  }
  return reduce((a, b) => `${a}${seperator}${b}`, iter);
});

다음 a라는 제너레이터를 생성해서 join함수를 실행시키면 똑같이 [Function (anonymous)] 가 출력됩니다. 제가 놓치고 있는 부분이 있을까요?

function* a() {
  yield 10;
  yield 20;
  yield 30;
  yield 40;
  yield 50;
}

log(join(a())) //[Function (anonymous)]

 

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

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

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