Scala 库中 PartialOrdering 的目的

chu*_*uwy 5 math scala standard-library

我从数学的角度理解什么是偏序,但看不到Scala 库中PartialOrdering类型类的使用位置和方式。我搜索了整个标准库,只有一种用法:它通过 Ordering 扩展。其主要方法的故事相同tryCompare,似乎没有在任何地方使用。

那么,如果不是,我可以得到什么好处

case class Foo(x: Int, y: String)

val order = Ordering.by { foo => (foo.x, foo.y) }
Run Code Online (Sandbox Code Playgroud)

我实现了一个更域正确的实例:

object PartialFoo extends PartialOrdering[Foo] {
  def tryCompare(a: Foo, b: Foo): Option[Foo] = {
    if (a.x != b.x) None  // Doesn't make sense to compare foos with different xs
    else ???
  }
}
Run Code Online (Sandbox Code Playgroud)

UPD:它似乎也是用返回类型(不是)定义的排序特征,我什至不能使用覆盖。是故意的吗?Some[Int]Option[Int]

Uly*_*ahi 1

这似乎是一个模板这似乎是类型类,它代表类型的自然偏序。

这些类的要点不是显式使用,而是在库中隐式使用,这将允许用户访问只能应用于具有此类可用自然类型类的类型的方法。

例如,Numeric类型类(例如sum集合方法的隐式参数)在执行类似val x = List(1, 2, 3).sum. 相反,scala 默认导入一个Numeric[Int]在范围内导入一个对象,这允许编译器“知道”如何对整数求和。

同样,如果要开发一种仅适用于具有自然偏序的元素的方法,则有两种选择:

  1. 创建类似的特征PartiallyOrdered并需要这种类型的参数 - 这不是很灵活,只需与 sum 方法进行比较,该方法可以在任何集合上调用

  2. 将类型的隐式参数添加PartialOrdering[T]到方法中,并创建所需类型的实现。

虽然我找不到任何不实现 Ordering 的 PartialOrdering 实际实现,但拥有此类仍然是一件好事,因为这意味着任何想要实现 PartialOrdering 但不实现 Ordering 的用户也将能够传递 Orderings使用 PartialOrdering 的方法!例如。整型、字符串等

假设我创建了一个类A和一个部分排序

APartialOrdering extends PartialOrdering[A]

因为我的类型A不承认自然顺序,只承认部分顺序。最后,我创建一个方法

def doSomethingForPartiallyOrdered[T](t: T)(implicit po: PartialOrdering[T]) = _

现在,我可以传递 类型的对象A,还可以传递 Int、String 等类型的对象。

  • 我假设 OP 知道什么是类型类以及它们如何在 Scala 中编码——这似乎不是问题。另外,还不清楚你的最后一句话是什么意思——当然不可能在需要“Ordering”的地方提供“PartialOrdering”。 (2认同)