Purpose of PartialOrdering in Scala library
我从数学的角度理解了什么是偏序,但是看不到Scala库中的PartialOrdering类型类在哪里以及如何使用。 我搜索了整个标准库,只有一种用法:通过订购进行了扩展。 其主要方法tryCompare具有相同的故事,似乎没有在任何地方使用。
所以,如果不是
1 2 3
| case class Foo (x : Int, y : String )
val order = Ordering. by { foo => (foo. x, foo. y) } |
我实现了一个域更正确的实例:
1 2 3 4 5 6
| 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])定义了订购特征,我什至不能使用覆盖。 这是故意的吗?
-
标准库充满了这样的谜团,我不确定是否有比"有人成功争辩说要在某个时候包含此库"更好的答案。
-
另外,我记得在任何Scala代码库中看到过的唯一地方就是Algebird。
这似乎是类型类的模板,它将代表类型的自然偏序。
这些类的要点不是显式使用的,而是在库中隐式使用的,该类将允许用户访问只能应用于具有此类自然类型类的类型的方法。
例如,Numeric类型类(例如,集合的sum方法的隐式参数)在执行类似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等类型的对象。
-
我假设OP知道什么是类型类,以及它们如何在Scala中编码-这似乎不是问题。 同样不清楚您的最后一句话的意思-当然不可能在期望Ordering的地方提供PartialOrdering。
-
否,但是可以提供订购服务来代替部分订购服务。 病得更清楚