首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala,Ord实例haskell

Scala,Ord实例haskell
EN

Stack Overflow用户
提问于 2013-09-07 23:37:09
回答 2查看 525关注 0票数 1

而在haskell,我能做到

代码语言:javascript
复制
data ABC = A | B | C

instance Ord ABC where
  A > B = True
  ... (and so on)

在斯卡拉,我开始

代码语言:javascript
复制
abstract class ABC
case object A extends ABC
... (and so on)

那么问题是,对于这个>/=比较问题,最好的scala解决方案是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-09 15:50:09

要创建像scala中那样的代数数据类型,您应该使用密封的特征。

代码语言:javascript
复制
sealed trait Base
object A extends Base
object B extends Base

然后,您可以写的排序,如机翼潜水艇上面指出:

代码语言:javascript
复制
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的模式匹配中没有进行彻底的检查,编译器将警告您。

现在您可以执行以下操作:

代码语言:javascript
复制
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

票数 3
EN

Stack Overflow用户

发布于 2013-09-08 04:59:24

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

代码语言:javascript
复制
implicit object Ordering[ABC] {
  def compare(x: ABC, y: ABC) = {
    // Write your definition here.
  }
} 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18678961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档