2

我正在浏览 Scala 3 文档。他们引入了given关键字,它被认为是 Scala 2 的替代品implicit。代码在这里

trait Ord[T] {
  def compare(x: T, y: T): Int
  def (x: T) < (y: T) = compare(x, y) < 0
  def (x: T) > (y: T) = compare(x, y) > 0
}

given intOrd: Ord[Int] {
  def compare(x: Int, y: Int) =
    if (x < y) -1 else if (x > y) +1 else 0
}

given listOrd[T]: (ord: Ord[T]) => Ord[List[T]] {

  def compare(xs: List[T], ys: List[T]): Int = (xs, ys) match {
    case (Nil, Nil) => 0
    case (Nil, _) => -1
    case (_, Nil) => +1
    case (x :: xs1, y :: ys1) =>
      val fst = ord.compare(x, y)
      if (fst != 0) fst else compare(xs1, ys1)
  }
}

我在这里很困惑,下面的代码中发生了什么:

given intOrd: Ord[Int] {
   def compare(x: Int, y: Int) =
   if (x < y) -1 else if (x > y) +1 else 0
}

Ord[T]它是在given关键字还是其他东西中实例化?

4

1 回答 1

7

given在这种情况下,Int它是 typeclass 的成员,并且对应于 Scala 2,通过定义Ord提供 typeclass 实例implicit

implicit object intOrd extends Ord[Int] {
  def compare(x: Int, y: Int) =
    if (x < y) -1 else if (x > y) +1 else 0
}

与 Scala 2 Implicits 的关系中所述。

Scala 3 by Example - Philip Schwarz 的更好的 Semigroup 和 Monoid幻灯片对 Scala 2 与 Scala 3 的类型类实现进行了出色的分步和并排比较,例如,

在此处输入图像描述

相关问题:如何在 Dotty 中使用 given?


关于提早提出这个问题的评论,请考虑deusaquilus在Revisiting Implicits中提出的类似问题

只是出于好奇,我们是否真的考虑在 Dotty 0.22 和 Scala 3 之间再次更改隐式?我正在尝试衡量功能稳定性,语法是其中很大一部分。

奥德斯基回复

就我而言,我希望我们已经达到了一个固定点。我实际上对目前的提议非常满意。如果有人有一个绝妙的主意,如何在接下来的几周内进一步改进它的某些方面,我当然很乐意考虑。但我的期望是,我们现在大体上已经完成了。

因此,它似乎given将成为 Scala 3 的一部分。

于 2020-01-22T18:16:59.287 回答