강의

멘토링

로드맵

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

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

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

Lập trình đa mô hình tập 1: Mẫu lặp & LISP (với TypeScript, Clojure, Kotlin)

hàm reduce và nạp chồng hàm

컴파일 에러

Viết

·

163

·

Đã chỉnh sửa

0

안녕하세요, 강의 잘 듣구 있습니다.

다름이 아니라 reduce 가 포함된 파일을 컴파일하면 그림과 같은 에러가 납니다.

 

image.png

 

에러 해결을 위해서 아래 두 가지 방법을 시도해보았습니다.

 

  • 에러메세지처럼 reduce 함수의 정의에 A extends Acc 로 명시

    • 이 해결방법은 옳지 않은 것 같다고 생각했습니다. (A -> number, Acc -> string 인 경우)

  • else 문에 있는 baseReduce 를 Acc 타입으로 강제 캐스팅

책과 강의 코드 모두 살펴봐도 크게 다른 점이 없는 것 같아 질문드립니다.

 

감사합니다!

(제가 작성한 코드 첨부드립니다) 

function baseReduce<A, Acc>(
  f: (acc: Acc, a: A) => Acc,
  acc: Acc,
  iterator: Iterator<A>
): Acc {
  while (true) {
    const { done, value: a } = iterator.next();

    if (done) {
      break;
    }

    acc = f(acc, a);
  }

  return acc;
}

function reduce<A, Acc>(f: (a: A, b: A) => Acc, iterable: Iterable<A>): Acc;
function reduce<A, Acc>(
  f: (acc: Acc, a: A) => Acc,
  acc: Acc,
  iterable: Iterable<A>
): Acc;
function reduce<A, Acc>(
  f: (acc: Acc | A, a: A) => Acc,
  accOrIterable: Acc | Iterable<A>,
  iterable?: Iterable<A>
): Acc {
  if (iterable === undefined) {
    iterable = accOrIterable as Iterable<A>;
    const iterator = iterable[Symbol.iterator]();
    const { done, value: acc } = iterator.next();

    if (done) {
      throw new TypeError('reduce of empty iterable with no initial value');
    }

    return baseReduce(f, acc, iterator) as Acc;
  } else {
    // 왜 타입변환을 강제해야하는가..??
    return baseReduce(
      f,
      accOrIterable as Acc,
      iterable[Symbol.iterator]()
    ) as Acc;
  }
}

 

javascript함수형-프로그래밍typescript객체지향소프트웨어-설계멀티-패러다임-프로그래밍

Quiz

Đâu là lợi ích chính của mô hình hàm trong viết code?

Tăng tốc code

Mã dễ đọc và có thể dự đoán

Giảm thiểu sử dụng bộ nhớ

Đơn giản hóa xử lý bất đồng bộ

Câu trả lời 2

0

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

타입스크립트 버전과 tsconfig 설정을 알려주실 수 있을까요? 그리고 공식 예제 저장소와 비교부탁드릴게요! 혹시 그래도 문제 있다면 말씀부탁드릴게요 :)

0

안녕하세요, 인프런 AI 인턴입니다.
chul kim님께서 직면하신 문제는 TypeScript의 타입 시스템과 관련된 흔한 난제 중 하나입니다. 이 코드에서 TypeScript는 Acc 타입이 A | Acc 타입과 어떻게든 호환되지 않는다고 경고하고 있습니다. 여기선 몇 가지 해결책을 제안할 수 있습니다.

  1. 제네릭 타입 제한:
    reduce 함수의 첫 번째 시도처럼 AAcc로 강제하는 방식은 근본적인 문제를 해결하지 못하는 상황일 수 있습니다. 특히 AAcc가 동일한 타입이 아니거나 서브타입을 이룰 때 문제가 발생할 수 있습니다. 따라서, 때에 따라 이 접근법은 적절하지 않을 수 있습니다.

  2. 타입 캐스팅:
    현재 Acc 타입으로 강제 캐스팅하는 방법을 사용하고 계신데, 강제로 타입을 캐스팅하는 것은 안정적이지 않을 수 있으며, 코드의 의도를 명확히 파악하기 어렵게 할 수 있습니다. 다만, 이 방법도 현실적인 상황에서는 어쩔 수 없이 사용해야 할 경우도 있습니다.

  3. 타입 커서마이징:
    A와 Acc는 실제로 다를 수 있습니다. 만약 AccA 타입을 포함할 수 있으며 이를 더 넓은 타입으로 지정할 수 있다면, 이 점을 바탕으로 타입을 재구성하거나 고쳐 나갈 수 있습니다. 즉, 타입을 더 잘 정의하고 그에 맞게 코드를 변경하는 방법을 검토해보세요.

다음은 관련 사례에서 비슷한 문제를 다뤘던 질문과 답변입니다. 참고하시길 바랍니다:

아래 링크에서는 함수형 프로그래밍과 관련된 패턴 및 TypeScript의 타입 시스템 관련 질문을 확인할 수 있습니다. 문제 해결에 도움이 되길 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

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

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

Đặt câu hỏi