Scala 如何使用用户定义的等式实现集合

Scala 如何使用用户定义的等式实现集合,scala,set,Scala,Set,这个问题与:是否可以在Scala中创建一个类似集合的类(意味着它扩展了集合特征),其中用于定义包含关系的等式由用户定义,而不是= 测试这是否真的有效的一种方法是检查filter是否返回相同的集合类型 // typeclass for equality trait Equals[T] { def isEqual(t1: T, t2: T): Boolean } // an object representing plane coordinates case class Coordinate(

这个问题与:是否可以在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 verify [T : Equals]     
val set = EqualitySet[Coordinate]()

// set2 must be of type EqualitySet[Coordinate]
val set2 = set.filter(_.i > 0)

我们与Miles Sabin(@milessabin)一起在Scala培训中创建了这个解决方案

然后,当我们使用上述代码时,我们得到:

scala> val set = EqualitySet[Coordinate](Coordinate(-1, 2), 
                                         Coordinate(-1, 3), 
                                         Coordinate(1, 4))

set: java.lang.Object with test.EqualitySet[Coordinate] = 
     Set(Coordinate(-1,2)
         Coordinate(1,4))

scala> val set2 = set.filter(_.i > 0)

// still an EqualitySet[Coordinate] \o/ */
set2: test.EqualitySet[Coordinate] = Set(Coordinate(1,4))
可能重复的
scala> val set = EqualitySet[Coordinate](Coordinate(-1, 2), 
                                         Coordinate(-1, 3), 
                                         Coordinate(1, 4))

set: java.lang.Object with test.EqualitySet[Coordinate] = 
     Set(Coordinate(-1,2)
         Coordinate(1,4))

scala> val set2 = set.filter(_.i > 0)

// still an EqualitySet[Coordinate] \o/ */
set2: test.EqualitySet[Coordinate] = Set(Coordinate(1,4))