而在haskell,我能做到
data ABC = A | B | C
instance Ord ABC where
A > B = True
... (and so on)在斯卡拉,我开始
abstract class ABC
case object A extends ABC
... (and so on)那么问题是,对于这个>/=比较问题,最好的scala解决方案是什么?
发布于 2013-09-09 15:50:09
要创建像scala中那样的代数数据类型,您应该使用密封的特征。
sealed trait Base
object A extends Base
object B extends Base然后,您可以写的排序,如机翼潜水艇上面指出:
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。
发布于 2013-09-08 04:59:24
Scala有类似Haskell的类型类,并在其标准库中使用它们。具体来说,Ordering是您要寻找的对象:
implicit object Ordering[ABC] {
def compare(x: ABC, y: ABC) = {
// Write your definition here.
}
} https://stackoverflow.com/questions/18678961
复制相似问题