유형 삭제로 인해 확장 된 기능에 대한 매개 변수 유형이 누락 됨

전체 싹

나중에 Pimp My Library 패턴 에 따라 사용하려는 다음 클래스를 작성했습니다 .

class ListX[A] (list: List[A]) {

    def zipMap[A, B, C] (that: List[B], op: (A, B) => C): List[C] =
        list.zip(that).map({
            case (a: A, b: B) => op(a, b)
        })
}

이것은 경고와 함께 컴파일됩니다.

[warn] /src/main/scala/ListX.scala:8: abstract type pattern A is unchecked since it is eliminated by erasure
[warn]             case (a: A, b: B) => op(a, b)
[warn]                      ^
[warn] /src/main/scala/ListX.scala:8: abstract type pattern B is unchecked since it is eliminated by erasure
[warn]             case (a: A, b: B) => op(a, b)
[warn]                            ^
[warn] two warnings found

REPL에서 테스트하면 다음 오류가 발생합니다.

scala> val a = new ListX(List(1, 1, 1))

scala> val b = List(1, 1, 1)

scala> val result = a.zipMap(b, _ + _)
error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.$plus(x$2))

scala> val expected = List(2, 2, 2)

나는 Scala를 처음 접했기 때문에 경고와 오류를 완전히 이해하지 못했습니다. "타입 삭제"라는 것이 있다는 것을 알고 있지만 작동 방식은 알 수 없으며 이것이 아마도 누락 된 유형으로 이어진다는 것을 알 수 있습니다.

그렇다면 무엇이 잘못되었으며 어떻게 수정할 수 있습니까?

최신 정보:

받아 들여진 답변과 의견 덕분에 문제를 수정하고 다음과 같이 수업을 다시 작성했습니다.

implicit class ListX[A] (list: List[A]) {

    def zipMap[B, C] (that: List[B])(op: (A, B) => C): List[C]
    = list.zip(that).map({ op.tupled })
}
고고학

코드에 많은 문제가 있습니다. 유형 삭제 뿐만이 아닙니다.

스칼라가 람다 유형을 파생 시키려면 별도의 인수 그룹에 (that: List[B])(op: (A, B) => C)넣은 다음 zipMap(List(1, 1, 1))(_ + _). 여기에서 이에 대한 많은 답변을 찾을 수 있습니다. 요컨대 스칼라는 B정의한 그룹의 유형 대해 알지 못하기 때문에 유형 을 지정한 첫 번째 그룹은 유형을 추론 할 수 없습니다.

그런 다음 유형 매개 변수를 A두 번 정의 했습니다. 하나는 당신의 수업에, 다른 하나는 당신의 방법에 있습니다. 한 번만 필요합니다. Scala는이 두 A가지 유형 매개 변수를 서로 다른 두 가지 유형 매개 변수로 이해 하므로 후자 A는에 관련되지 않았기 때문에 실제 유형이 없으며 list: List[A]scala에 대한 유형을 파생 할 수 없습니다 _ + _.

그리고 ClassTag유형 삭제와 싸우려면 유형 매개 변수에 대한 컨텍스트 바인딩 이 필요합니다 . 다음과 같이 작성한다 [A : ClassTag]짧은이 스칼라 당신의 모두에 대해 형식 정보를 첨부 할 수에서 AB스칼라 경기에서 그것을 사용하기 위해.

따라서 결과 코드는 다음과 같습니다.

(답변 끝에있는 코드를 더 나은 버전으로 참조하십시오.이 버전은 단순화 될 수 있습니다)

  class ListX[A : ClassTag](list: List[A]) {

    def zipMap[B: ClassTag, C](that: List[B])(op: (A, B) => C): List[C] =
      list.zip(that).map({
        case (a: A, b: B) => op(a, b)
      })
  }

  println(new ListX[Int](List(2, 2, 2)).zipMap(List(1, 1, 1))(_ + _))

최신 정보

@ Łukasz 댓글에 대해 조금 생각한 후 실수를 저질렀다는 것을 깨달았습니다 ClassTag. 여기 에는 정말 필요하지 않습니다 . 경고를 생성 한 이유는 명시 적으로 case유형을 가져야한다고 지정했기 때문 (A, B)입니다. 대신 컴파일러에게 이것을 스스로 알아낼 기회를 줄 수 있고, 여기서 무슨 일이 일어나고 있는지 올바르게 이해한다면 컴파일러 ClassTag는 아무것도하지 않기 때문에 여기서 s 가 필요하지 않다는 것을 알아낼 수 있습니다 . 이것 좀 봐:

  class ListX[A](list: List[A]) {

    def zipMap[B, C](that: List[B])(op: (A, B) => C): List[C] =
      list.zip(that).map({
        case (a, b) => op(a, b)
      })
  }

  println(new ListX[Int](List(2, 2, 2)).zipMap(List(1, 1, 1))(_ + _))

이것은 경고를 생성하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

"확장 된 기능에 대한 누락 된 매개 변수 유형"추적

분류에서Dev

기본에서 문자로의 변환을위한 확장 함수의 매개 변수 유형이 누락되었습니다.

분류에서Dev

매개 변수화 된 유형에 대한 특정 유형 인스턴스인지 확인

분류에서Dev

모든 유형 T에 대한 매개 변수 팩 확인

분류에서Dev

제네릭 클래스에 대한 유형 인수 누락

분류에서Dev

왜 React 컴포넌트에 대한 유형 매개 변수를 지정한 후에도 linter가 props 유효성 검사에서 누락 된 '<property>'에 대해 불평하는 이유는 무엇입니까?

분류에서Dev

유형 확장에 대한 제약 조건에서 제네릭 유형 매개 변수를 사용할 수없는 이유는 무엇입니까?

분류에서Dev

일반 유형 목록에 대한 Getter (매개 변수로 전달됨)

분류에서Dev

Rust "이 제한된 유형 매개 변수에 대한 유형을 결정할 수 없습니다 : 제한되지 않은 유형"

분류에서Dev

매개 변수화 된 gtest 유형에 대한 다형성

분류에서Dev

Typo3-extbase-유형 정보 누락, 매개 변수 "$ currentPage"에 대한 @param 주석이 없을 수 있음

분류에서Dev

매개 변수 팩에 정확한 순서로 정확한 유형이 있는지 확인하는 방법

분류에서Dev

Play 템플릿의 '누락 된 매개 변수 유형'

분류에서Dev

명명 된 매개 변수로 정의 된 함수에 대한 MyPy 유형 힌트이지만 ** kwargs?

분류에서Dev

scala # 유형 매개 변수로 대출 패턴 확장 : issue

분류에서Dev

다른 유형 매개 변수에 대한 제약이있는 유형 매개 변수의 일반적인 추론

분류에서Dev

매개 변수에 전달 된 유형을 기반으로 특정 컬렉션 인 제네릭 유형 반환

분류에서Dev

TypeScript : 일반 함수 유형 인수가 잘못된 매개 변수에서 유추 됨

분류에서Dev

반환 된 매개 변수에 대한 useReducer의 일반 유형

분류에서Dev

Bifunctor에 대한 매개 변수화 된 유형 별칭

분류에서Dev

오류 : 'bar <int> &'유형의 매개 변수에 대한 기본 인수에 'bar <int>'유형이 있습니다.

분류에서Dev

유형 매개 변수로 캐스트해야하고 제한된 유형을 사용할 수없는 이유는 무엇입니까?

분류에서Dev

매개 변수 팩 오류에서 clang에 기본 인수가 누락 된 이유는 무엇입니까?

분류에서Dev

YouTube 데이터 API 삽입 방법에 대해 누락 된 매개 변수

분류에서Dev

유형 안전성을 잃는 일반 매개 변수에 대한 유형 확장

분류에서Dev

Scala : PartialFunction reify를 사용하여 scala 매크로를 호출 할 때 '누락 된 매개 변수 유형'

분류에서Dev

SQL Server에서 테이블 유형 매개 변수에 대해 생성 된 행 가져 오기

분류에서Dev

인터페이스는 조건부 유형에서 매핑 된 유형을 확장 할 수 없습니다.

분류에서Dev

유형 매개 변수 'S'에 대해 유추 된 유형 'S'가 범위 내에 있지 않은 이유는 무엇입니까?

Related 관련 기사

  1. 1

    "확장 된 기능에 대한 누락 된 매개 변수 유형"추적

  2. 2

    기본에서 문자로의 변환을위한 확장 함수의 매개 변수 유형이 누락되었습니다.

  3. 3

    매개 변수화 된 유형에 대한 특정 유형 인스턴스인지 확인

  4. 4

    모든 유형 T에 대한 매개 변수 팩 확인

  5. 5

    제네릭 클래스에 대한 유형 인수 누락

  6. 6

    왜 React 컴포넌트에 대한 유형 매개 변수를 지정한 후에도 linter가 props 유효성 검사에서 누락 된 '<property>'에 대해 불평하는 이유는 무엇입니까?

  7. 7

    유형 확장에 대한 제약 조건에서 제네릭 유형 매개 변수를 사용할 수없는 이유는 무엇입니까?

  8. 8

    일반 유형 목록에 대한 Getter (매개 변수로 전달됨)

  9. 9

    Rust "이 제한된 유형 매개 변수에 대한 유형을 결정할 수 없습니다 : 제한되지 않은 유형"

  10. 10

    매개 변수화 된 gtest 유형에 대한 다형성

  11. 11

    Typo3-extbase-유형 정보 누락, 매개 변수 "$ currentPage"에 대한 @param 주석이 없을 수 있음

  12. 12

    매개 변수 팩에 정확한 순서로 정확한 유형이 있는지 확인하는 방법

  13. 13

    Play 템플릿의 '누락 된 매개 변수 유형'

  14. 14

    명명 된 매개 변수로 정의 된 함수에 대한 MyPy 유형 힌트이지만 ** kwargs?

  15. 15

    scala # 유형 매개 변수로 대출 패턴 확장 : issue

  16. 16

    다른 유형 매개 변수에 대한 제약이있는 유형 매개 변수의 일반적인 추론

  17. 17

    매개 변수에 전달 된 유형을 기반으로 특정 컬렉션 인 제네릭 유형 반환

  18. 18

    TypeScript : 일반 함수 유형 인수가 잘못된 매개 변수에서 유추 됨

  19. 19

    반환 된 매개 변수에 대한 useReducer의 일반 유형

  20. 20

    Bifunctor에 대한 매개 변수화 된 유형 별칭

  21. 21

    오류 : 'bar <int> &'유형의 매개 변수에 대한 기본 인수에 'bar <int>'유형이 있습니다.

  22. 22

    유형 매개 변수로 캐스트해야하고 제한된 유형을 사용할 수없는 이유는 무엇입니까?

  23. 23

    매개 변수 팩 오류에서 clang에 기본 인수가 누락 된 이유는 무엇입니까?

  24. 24

    YouTube 데이터 API 삽입 방법에 대해 누락 된 매개 변수

  25. 25

    유형 안전성을 잃는 일반 매개 변수에 대한 유형 확장

  26. 26

    Scala : PartialFunction reify를 사용하여 scala 매크로를 호출 할 때 '누락 된 매개 변수 유형'

  27. 27

    SQL Server에서 테이블 유형 매개 변수에 대해 생성 된 행 가져 오기

  28. 28

    인터페이스는 조건부 유형에서 매핑 된 유형을 확장 할 수 없습니다.

  29. 29

    유형 매개 변수 'S'에 대해 유추 된 유형 'S'가 범위 내에 있지 않은 이유는 무엇입니까?

뜨겁다태그

보관