인프런 커뮤니티 질문&답변

projectkmscom님의 프로필 이미지
projectkmscom

작성한 질문수

함수형 프로그래밍과 JavaScript ES6+

Array.prototype.join 보다 다형성이 높은 join 함수

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

해결된 질문

작성

·

333

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())) 로 했을 때에도 기본 파라미터를 활용할 수 있는 방법이 궁금합니다..!

답변 2

1

유인동님의 프로필 이미지
유인동
지식공유자

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

0

안녕하세요, 인프런 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을 출력합니다.

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

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

projectkmscom님의 프로필 이미지
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)]

 

projectkmscom님의 프로필 이미지
projectkmscom

작성한 질문수

질문하기