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 依赖外层实例,目前只做到把它放进外层类的子类里面。 可惜,在多个地方继承 Outer,就意味着每个新子类里都得重复这个方便使用的 ca…

    回复 1最近活动 scala
  2. 比较 Lean4 中的 have 和 let 绑定

    我发现下面两个表达式 以及 行为完全相同。证明定理时也是这样。 它们可以互换吗?区别在哪里?

    回复 3最近活动 lean-4
  3. 初始化以字符串数组为值的 TypeScript Map

    我在创建一个 Map,其中每个条目都保存字符串数组。怎样在一条语句中同时声明类型并完成初始化? 我(天真地)这样试了一下。 结果是下面这个错误。

    回复 2最近活动 typescript