【问题标题】:What does the `*` mean in a generic type?泛型类型中的“*”是什么意思?
【发布时间】:2020-06-22 09:45:55
【问题描述】:

我在学习 Cats 库时发现 * 是一个泛型类型,就像这样:

implicit def catsDataSemigroupKForValidated[A](implicit A: Semigroup[A]): SemigroupK[Validated[A, *]] =
  new SemigroupK[Validated[A, *]] {
    def combineK[B](x: Validated[A, B], y: Validated[A, B]): Validated[A, B] = x match {
      case v @ Valid(_) => v
      case Invalid(ix) =>
        y match {
          case Invalid(iy)  => Invalid(A.combine(ix, iy))
          case v @ Valid(_) => v
        }
    }
  }

我的猜测是使用*,因为combineK方法返回Validated[A, B]所以不需要指定泛型类型。或者它可能是Any 类型(如建议使用 Inteliij)。我会很高兴得到您的解释。

【问题讨论】:

    标签: scala generics scala-cats


    【解决方案1】:

    您正在查看的猫代码是 master 分支,用于 Dotty (Scala 3)。 *是3.0中的类型参数占位符:

    https://dotty.epfl.ch/docs/reference/changed-features/wildcards.html

    请注意,它已在 3.2 中被弃用,并在 3.3 中被删除以支持_


    编辑

    也用于实物投影仪插件

    【讨论】:

    • 注意“通配符”和“类型参数占位符”是完全不同的; 3.0 中的 *-Ykind-projector 是占位符,不是通配符。
    • 这个答案仍然完全不正确。目前 Cats 甚至没有在 Master 上的 Dotty 上交叉构建。 * 是由广泛使用的 Scala 2 编译器插件 kind-projector 提供的语法。 Dotty 暂时支持 * 以兼容使用 kind-projector(如 Cats)的 Scala 2 代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2012-04-19
    • 2019-04-02
    • 1970-01-01
    • 2021-04-07
    • 2020-12-04
    相关资源
    最近更新 更多