2016-04-22 47 views
4

从数学的角度我明白什么是partial order,但是看不到在Scala库中可以使用哪些类型的类以及如何使用PartialOrdering。我搜索整个标准库,并且只有一个用法:它通过Ordering进行扩展。它的主要方法tryCompare同样的故事,似乎没有在任何地方使用。Scala库中PartialOrdering的用途

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

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

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

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

我实现一个更域的正确的实例有它也好像订购特质defined与回报键入Some[Int](而不是Option[Int]),我甚至不能使用覆盖。这是故意的吗?

+3

标准库已满这样的谜团,我不确定有没有更好的答案比“有人争论在某个时候包含这个”更好。 –

+0

此外,我记得在任何Scala代码库中使用的唯一地方是Algebird。 –

回答

1

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

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

作为一个例子,Numeric类型类,其例如藏品sum方法的隐含参数,是从来没有真正明确做这样的事情val x = List(1, 2, 3).sum时提供。 相反,默认情况下,scala会在范围内导入一个Numeric[Int]对象,这允许编译器“知道”如何对ints进行求和。

同样,如果一个人要发展,因为这只会“做事”为元素与自然偏序,将有两种选择方法:

  1. 创建的PartiallyOrdered喜欢的特质和需要这种类型的参数 - 这不是非常灵活,只是与总和方法相比,可以在任何集合上调用

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

虽然我无法找到PartialOrdering的任何实际的实现不也实现了订货,有这个类仍然是一件好事,因为这意味着它想实现PartialOrdering任何用户,但不订货, 也将能够通过Orderial他们的方法使用PartialOrdering的!例如。诠释,String等

所以说,我创建一个类A和偏序

APartialOrdering extends PartialOrdering[A]

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

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

,我可以通过A类型的对象,同时也诠释的,字符串等

+2

我假设OP知道什么类型的类以及它们如何在Scala中编码 - 这似乎不是问题。此外,还不清楚你的最后一句话是什么意思 - 当然预计不会提供一个“订购”的“PartialOrdering”。 –

+0

不,但可以提供订单来代替部分订购。我会更清楚 –