我刚刚偶然发现了Tony Morris关于Java的博客文章, 以及该语言面临的一个基本问题:为集合定义一种定制的相等关系。我认为这是一件非常重要的事情,想知道是否有Scala的解决方案。
经典的问题体现在思考交易时。假设我进行了两次 +100 vodafone 股票 @150p 的交易。这两笔交易相等,对吗?但它们并不是同一笔交易。在正常的现实系统中,通过持久化或序列化,我不能依靠标识告诉我两个引用是否指向同一笔交易!
因此,我想创建一个集合,可以将等式关系传递给它:
我该如何高效地实现我的集合(除非“EqualityRelation”还定义了哈希机制)?
经典的问题体现在思考交易时。假设我进行了两次 +100 vodafone 股票 @150p 的交易。这两笔交易相等,对吗?但它们并不是同一笔交易。在正常的现实系统中,通过持久化或序列化,我不能依靠标识告诉我两个引用是否指向同一笔交易!
因此,我想创建一个集合,可以将等式关系传递给它:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
我该如何高效地实现我的集合(除非“EqualityRelation”还定义了哈希机制)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
所以问题是:
- 是否有提供此功能的库?
- 在Scala中是否有一种整洁的方法来实现这个功能?
似乎使用implicit,将此功能添加到现有的scala Set
类型中将会非常容易。
"Hello" === 2
不能编译。 - oxbow_lakesEqual[List[Foo]]
可以通过Equal[Foo]
进行参数化。这使得你的目标达成了一半。Martin Odersky 拒绝将Hash[T]
添加到标准库中,他说:“我们希望保持通用哈希,它太过于 Java 文化的一部分。”http://www.scala-lang.org/node/4091#comment-16327 - retronym