Scala,Ord实例像是一样

时间:2013-09-07 23:37:09

标签: scala haskell compare

而在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解决方案是什么? /< /> =比较问题?

2 个答案:

答案 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.
  }
}