这个问题关系到这一个:是否有可能创建一组类的类(意思是它的扩展Set特性)Scala中,其中使用的平等来定义包含关系是由用户,而不是被定义的==?
测试这是否真的有效的一种方法是检查是否filter返回相同的集合类型.
// typeclass for equality
trait Equals[T] {
def isEqual(t1: T, t2: T): Boolean
}
// an object representing plane coordinates
case class Coordinate(i: Int, j: Int)
// an equality saying that 2 coordinates are equal if they are on
// the same horizontal line
implicit def horizontalEquality: Equals[Coordinate] = new Equals[Coordinate] {
def isEqual(t1: Coordinate, t2: Coordinate) = t1.i == t2.i
}
// we create an EqualitySet[T] where T must …Run Code Online (Sandbox Code Playgroud) 我只是偶然发现了Tony Morris 关于Java的博客文章之一以及该语言的一个基本问题:为集合定义一个定制的平等关系.这是我认为是一个大问题,并想知道是否有一些scala解决方案.
经典问题表现在考虑交易.假设我在@ 150p进行了两笔+100沃达丰股票交易.这两笔交易是平等的,是吗?除非他们不是同一笔交易.对于普通的真实世界系统,使用持久性或序列化,我不能依赖身份来告诉我两个引用是否属于同一行业!
所以我想要的是能够创建一个我可以传递Equality-relation的集合:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
Run Code Online (Sandbox Code Playgroud)
我如何以有效的方式实现我的集合(除非EqualityRelation还定义了一种hash机制)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
Run Code Online (Sandbox Code Playgroud)
所以问题是:
似乎带有隐含,添加到现有的scala Set类型将是一件非常容易的事情.