1

而在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解决方案是什么?

4

2 回答 2

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)

有关密封特性的更多信息,请查看此处

于 2013-09-09T15:50:09.500 回答
2

Scala 有类似于 Haskell 的类型类,并在其标准库中使用它们。Ordering,具体来说,是您正在寻找的那个:

implicit object Ordering[ABC] {
  def compare(x: ABC, y: ABC) = {
    // Write your definition here.
  }
} 
于 2013-09-08T04:59:24.433 回答