openlang

타입 증거에 왜 경고하나요?

이 경고가 이해가 안 되네요"

[warn] -- [E198] Unused Symbol Warning: /Users/.../polycheck/helpers.scala:25:30 
[warn] 25 |def hasStandardForm[P: PolyFamily](entry: P): Boolean = entry.asMatchable match ...
[warn]    |                              ^
[warn]    |                              unused implicit parameter

암시적 인자를 직접 쓰지는 않지만, 덕분에 hasStandardForm가 PolyFamily 타입클래스에 속하지 않는 타입을 받지 못하잖아요. 그렇다면 여기서 (사용되지 않는) 암시적 인자를 쓰는 건 정당하지 않나요?

영어에서 번역원문 보기

이어지는 대화 3

서로의 근거를 따라
  1. 고유 링크

    네, 그걸 증거라고 불러요.

    기억이 맞다면 Scala 2에서는 ev라고 이름을 붙이면 경고가 사라지는데, Scala 3도 그 관례를 따르는지는 모르겠어요.

    아니면 그냥 @nowarn를 붙이면 돼요.

    영어에서 번역원문 보기
  2. 고유 링크

    ev라고 해도 여전히 경고하네요:

    [warn] -- [E198] Unused Symbol Warning: /Users/tavin/work/exercises-853_962/5/PolyFamily/src/test/scala/polycheck/helpers.scala:25:34 
    [warn] 25 |def hasStandardForm[P](entry: P)(using ev: PolyFamily[P]): Boolean = entry.asMatchable match
    [warn]    |                                  ^^
    [warn]    |                                  unused implicit parameter
    영어에서 번역원문 보기
  3. 고유 링크

    몇몇 잘 알려진 타입과 멤버가 없는 타입(“마커 인터페이스”)은 이 경고에서 제외돼요.

    예를 들어 Comparable는 경고가 나요. 비교를 전혀 하지 않는다면 제약이 더 이상 필요 없거나, 비교하는 걸 빠뜨렸을 수도 있겠죠.

    scala> def inspect[A: Comparable] = "57".toInt
    1 warning found
    -- [E198] Unused Symbol Warning: -----------------------------------------------
    1 |def inspect[A: Comparable] = "57".toInt
      |                   ^
      |                   unused implicit parameter
    def inspect[A](using evidence$1: Comparable[A]): Int

    이렇게 풀어 쓴 형태에서 사용하지 않는다고 표시해야 할 거예요:

    scala> def inspect[A](item: A)(using @unused witness: Comparable[A]) = item.toString
    def inspect[A](item: A)(using witness: Comparable[A]): String

    이게 @nowarn보다 조금 더 깔끔하지만, 후자는 컨텍스트 바운드 표기에서도 쓸 수 있어요.

    (이름으로 검사하던 건 다음 선택지가 생기기 전일 것 같아요

    -Wunused:explicits,implicits,synthetics

    사실 Scala 3에는 아직 synthetics가 없고 Scala 2에만 있어요:

      -Wunused:synthetics               Warn if a synthetic implicit parameter (context bound) is unused.
      -Wunused:nowarn                   Warn if a @nowarn annotation does not suppress any warnings.
      -Wunused:params                   Enable -Wunused:explicits,implicits,synthetics.

    팬데믹 초기에 추가됐는데, 아마 시간을 보내려던 거겠죠.)

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 다른 클래스 안에 있는 클래스를 상속하려면 어떻게 하나요?

    안녕하세요, 제가 코드를 바꿀 수 없는 패키지에 다음과 같은 클래스 계층이 있어요: 편하게 쓰려고 Inner를 감싸는 래퍼를 추가하려는데, Inner가 바깥 인스턴스에 의존해서 지금까지는 바깥 클래스의 서브클래스 안에 넣는…

    답글 1최근 활동 scala
  2. Lean4의 have 바인딩과 let 바인딩 비교

    아래 두 표현식을 보니 그리고 똑같이 동작하더군요. 정리를 증명할 때도 마찬가지예요. 서로 바꿔 써도 되나요? 차이가 뭔가요?

    답글 3최근 활동 lean-4
  3. 문자열 배열을 값으로 갖는 TypeScript Map 초기화

    각 항목이 문자열 배열을 담는 Map을 만들고 있어요. 타입 선언과 초기화를 한 문장으로 같이 하려면 어떻게 하나요? 제 (단순한) 시도는 이랬어요: 그랬더니 이렇게 나와요:

    답글 2최근 활동 typescript