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. Ссылка на ответ

    Да, это и называют свидетельством.

    Если память не подводит, имя ev убирает предупреждение в Scala 2, но не знаю, соблюдается ли эта договорённость в 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. Как унаследовать класс внутри другого класса?

    Здравствуйте, В пакете, код которого я не могу менять, есть такая иерархия классов: Я хочу добавить удобную обёртку вокруг In…

    Ответы 1Последняя активность scala
  2. Сравнение привязок have и let в Lean4

    Я заметил, что эти два выражения и ведут себя одинаково. То же происходит при доказательстве теорем. Они взаимозаменяемы? В ч…

    Ответы 3Последняя активность lean-4
  3. Инициализация TypeScript Map со значениями в виде массивов строк

    Создаю Map, в котором каждая запись содержит массив строк. Как одновременно задать его тип и инициализировать одним выражение…

    Ответы 2Последняя активность typescript