Scala库中PartialOrdering的目的

时间:2016-04-22 10:15:24

标签: scala math standard-library

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

那么,如果不是

,我可以获得什么好处
case class Foo(x: Int, y: String)

val order = Ordering.by { foo => (foo.x, foo.y) }

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

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 ???
  }
}

UPD :它看起来像订单特征defined,返回类型为Some[Int](不是Option[Int]),我甚至无法使用覆盖。这是故意的吗?

1 个答案:

答案 0 :(得分:1)

这似乎是类型类的模板,它表示类型的自然部分排序。

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

作为示例,Numeric类型类(例如集合的sum方法的隐式参数)在执行val x = List(1, 2, 3).sum之类的操作时从未实际明确提供。 相反,scala默认情况下在作用域中导入Numeric[Int]对象,这允许编译器“知道”如何对int进行求和。

同样,如果要开发一种方法,只对具有自然偏序的元素“起作用”,则有两种选择:

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

    < / LI>
  2. 向方法添加类型为PartialOrdering[T]的隐式参数,并为所需类型创建实现。

  3. 虽然我找不到任何实现PartialOrdering但也没有实现Ordering的实现,但是这个类仍然是一件好事,因为它意味着任何想要实现PartialOrdering的用户,而不是Ordering,将也可以使用PartialOrdering将Orderings 传递给他们的方法!例如。 Int,String等

    所以说我创建了一个类A和一个部分排序

    APartialOrdering extends PartialOrdering[A]

    因为我的类型A不允许自然排序,只允许部分自然排序。最后,我创建了一个方法

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

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