在 Scala 中设计通用特征
Design a generic trait in Scala
最近在学习数据结构。有一种情况,我想设计一个通用特征,该类型应该支持可比性。如果我需要设计一个通用的class,我可以像下面这样设计:
class SortedType [A: Ordering](val x: A)
val x = new SortedType(3)
val y = new SortedType("Hello, World!")
但是,由于在 scala 中,trait 不能有带有上下文边界的参数,所以我不能定义这样的 trait trait SortedType[A: Ordering]
。我如何设计特征以使其对泛型类型的支持具有可比性?
感谢您的慷慨建议!
约束 [A: Ordering]
没有说明类型 A
本身的任何信息。相反,它指定存在类型 Ordering[A]
的(隐式)实例。保证 Ordering[A]
类型实例存在的最简单方法是简单地提供一个方法 def ord: Ordering[A]
.
因此,您可以将排序设为 trait
的成员,然后接受排序作为工厂方法参数:
trait SortedStuff[A] {
def ord: Ordering[A]
def x: A
}
object SortedStuff {
def apply[A: Ordering](a: A) = new SortedStuff[A] {
def ord = implicitly
def x = a
}
}
请注意,只有当 SortedStuff
是某种应该在一大堆 A
上运行的模块时,这才有意义。将 Ordering
附加到 A
的单独元素没有任何意义 - 排序是 在 元素之间的关系,而不是每个孤立的 属性元素.
最近在学习数据结构。有一种情况,我想设计一个通用特征,该类型应该支持可比性。如果我需要设计一个通用的class,我可以像下面这样设计:
class SortedType [A: Ordering](val x: A)
val x = new SortedType(3)
val y = new SortedType("Hello, World!")
但是,由于在 scala 中,trait 不能有带有上下文边界的参数,所以我不能定义这样的 trait trait SortedType[A: Ordering]
。我如何设计特征以使其对泛型类型的支持具有可比性?
感谢您的慷慨建议!
约束 [A: Ordering]
没有说明类型 A
本身的任何信息。相反,它指定存在类型 Ordering[A]
的(隐式)实例。保证 Ordering[A]
类型实例存在的最简单方法是简单地提供一个方法 def ord: Ordering[A]
.
因此,您可以将排序设为 trait
的成员,然后接受排序作为工厂方法参数:
trait SortedStuff[A] {
def ord: Ordering[A]
def x: A
}
object SortedStuff {
def apply[A: Ordering](a: A) = new SortedStuff[A] {
def ord = implicitly
def x = a
}
}
请注意,只有当 SortedStuff
是某种应该在一大堆 A
上运行的模块时,这才有意义。将 Ordering
附加到 A
的单独元素没有任何意义 - 排序是 在 元素之间的关系,而不是每个孤立的 属性元素.