Scala 如何使用用户定义的等式实现集合
这个问题与:是否可以在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(
集合
特征),其中用于定义包含关系的等式由用户定义,而不是=
测试这是否真的有效的一种方法是检查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))