我刚刚偶然发现了托尼·莫里斯的blog-posts about Java之一和语言的一个基本问题:为集合定义一个定制的平等关系。这是我认为是大交易,并想知道是否有一些scala解决方案。斯卡拉的平等关系
经典问题体现在思考交易。假设我做了两次150p沃达丰股份交易。这两个交易是平等的,是吗?除他们不是同行。在一个普通的真实系统的情况下,通过持久化或序列化,我不能依靠标识来告诉我两个引用是否是相同的交易!
所以,我要的是能够创建一个集合,我可以通过一个平等,关系到:
val as = CleverSet[Trade](IdEquality)
val bs = CleverSet[Trade](EconomicsEquality)
我将如何实现有效的方式我定的(除非EqualityRelation
还定义了hash
机制)?
trait EqualityRelation[T] {
def equal(t1: T, t2: T) : Boolean
def hash(t: T) : Int
}
所以问题是:
- 是否有提供这种能力的图书馆吗?
- 有没有在Scala中整洁地做这件事的方法?
看来,有了暗示,将它添加到现有的scala Set
类型将是一件相当容易的事情。
在斯卡拉有相同的:http://github.com/scalaz/scalaz/blob/master/example/src/main/scala/scalaz/ExampleEqual.scala。但我不太熟悉,可以说明它的基础。 – 2010-02-26 13:23:27
我认为这只是一个类型安全的平等,所以''你好“=== 2'不能编译 – 2010-02-26 16:20:46
scalaz.Equal不只是类型安全,它也是一个灵活的。 'Equal [List [Foo]]]'可由'Equal [Foo]'参数化。这走向了你的目标的一半。马丁奥德斯基拒绝向标准库中添加哈希,他说“我们希望保持通用哈希,它是Java文化中太多的一部分。” http://www.scala-lang.org/node/4091#comment-16327 – retronym 2010-02-26 18:03:15