我从数学的角度理解什么是partial order,但是看不到Scala库中的PartialOrdering类型类在哪里以及如何使用。我搜索了整个标准库,只有一种用法:通过订购进行了扩展。其主要方法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:似乎还具有返回类型
Some[Int]
(不是Option[Int]
)的订购特征defined,我什至不能使用替代。这是故意的吗? 最佳答案
这似乎是类型类的模板,它将代表类型的自然部分排序。
这些类的要点不是显式使用的,而是在库中隐式使用的,该类将允许用户访问只能应用于具有此类自然类型类的类型的方法。
例如,当执行类似Numeric
的操作时,实际上并没有显式提供sum
类型类,例如,它是collections val x = List(1, 2, 3).sum
方法的隐式参数。
相反,默认情况下,scala会在作用域中导入Numeric[Int]
对象,这使编译器可以“知道”如何对整数求和。
同样,如果要开发一种仅对具有自然偏序的元素“起作用”的方法,则有两种选择:
创建PartiallyOrdered
之类的特征并需要这种类型的参数-这不是非常灵活,只需与sum方法进行比较即可,该方法可以在ANY集合上调用
向该方法添加类型为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,Strings等类型的对象。