而在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解决方案是什么? /< /> =比较问题?
答案 0 :(得分:3)
要创建类似于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)
有关密封特性的更多信息,请查看here。
答案 1 :(得分:2)
Scala具有类似Haskell的类型类,并在其标准库中使用它们。具体而言,Ordering
是您正在寻找的那个:
implicit object Ordering[ABC] {
def compare(x: ABC, y: ABC) = {
// Write your definition here.
}
}