而在haskell我可以做
data ABC = A | B | C
instance Ord ABC where
A > B = True
... (and so on)
在 Scala 我开始
abstract class ABC
case object A extends ABC
... (and so on)
那么问题是,这个> / < / > =比较问题的最佳scala解决方案是什么?
要在 scala 中创建类似的代数数据类型,您应该使用密封特征。
sealed trait Base
object A extends Base
object B extends Base
然后您可以按照上面指出的wingedsubmariner 编写顺序:
implicit object baseOrdering extends Ordering[Base]{
def compare(a:Base, b:Base): Int = (a,b) match{
case (A,B) => -1
case (B,A) => 1
case (A,A) | (B,B) => 0
}
}
这种方法的好处是,如果您没有在您使用的模式匹配中进行详尽的检查,编译器会警告您Base
。
现在您可以执行以下操作:
val a:Seq[Base] = Seq(A,B,A)
res2: a: Seq[Base] = List(A, B, A)
a.sorted
res3: Seq[Base] = List(A, A, B)
有关密封特性的更多信息,请查看此处。
Scala 有类似于 Haskell 的类型类,并在其标准库中使用它们。Ordering
,具体来说,是您正在寻找的那个:
implicit object Ordering[ABC] {
def compare(x: ABC, y: ABC) = {
// Write your definition here.
}
}