加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala库中PartialOrdering的目的

发布时间:2020-12-16 08:45:08 所属栏目:安全 来源:网络整理
导读:我从数学角度理解 partial order是什么,但是看不到Scala库中 PartialOrdering类型类的位置和方式.我搜索了整个标准库,只有一种用法:它通过Ordering扩展.其主要方法tryCompare的故事相同,似乎没有在任何地方使用. 那么,如果不是,我可以获得什么好处 case cla
我从数学角度理解 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:它看起来像Ordering trait defined返回类型Some [Int](不是Option [Int])我甚至不能使用覆盖.这是故意的吗?

解决方法

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

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

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

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

>创建一个类似PartiallyOrdered的特征并要求这种类型的参数 – 这不是很灵活,只需与sum方法比较,可以在任何集合上调用
>向方法添加类型为PartialOrdering [T]的隐式参数,并为所需类型创建实现.

虽然我找不到PartialOrdering的任何实际实现,它们也没有实现Ordering,但是这个类仍然是一件好事,因为它意味着任何想要实现PartialOrdering而不是Ordering的用户也能够通过Orderings使用PartialOrdering的方法!例如. Int,String等

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

APartialOrdering扩展了PartialOrdering [A].

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

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

现在,我可以传递A类对象,也可以传递Int,Strings等.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读