什么是Scala与F#中被歧视联盟的对手?

Joh*_*ith 24 f# scala

如何将F#中的Discriminated Union转换为Scala:

type Expr =
    | Val     of String
    | Integer of Int32
    | Lower   of Expr * Expr
    | Greater of Expr * Expr
    | And     of Expr * Expr
    | Or      of Expr * Expr
Run Code Online (Sandbox Code Playgroud)

有一篇类似的文章谈论F#和Scala中的ADT,但这似乎不是我追求的.

Did*_*ont 35

这是通过scala中的继承来完成的(可能不幸的是因为它更冗长)

sealed trait Expr
case class Val(s: String) extends Expr
case class Integer(i: Int) extends Expr
case class Lower(left: Expr, right: Expr) extends Expr
case class Greater(left: Expr, right: Expr) extends Expr
...
Run Code Online (Sandbox Code Playgroud)

你可以进一步输入

sealed trait Expr[A]
case class Val(s: String) extends Expr[String]
case class Integer(i: Int) extends Expr[Int]
case class Lower[X](left: Expr[X], right: Expr[X])(implicit val ordering: Ordering[X]) extends Expr[Boolean]
Run Code Online (Sandbox Code Playgroud)

模式匹配

def valueOf[A](expr: Expr[A]) : A = expr match {
   case Val(s) => s
   case Integer(i) => i
   case l @ Lower(a,b) => l.ordering.lt(valueOf(a), valueOf(b))
   ...
}
Run Code Online (Sandbox Code Playgroud)

作为Expr中的一种方法,valueOf可能会更好

sealed trait Expr[A] {def value: A}
case class Val(value: String) extends Expr[String]
case class Integer(value: Int) extends Expr[Int]
case class Lower[X: Ordering](left: Expr[A], right: Expr[A]) extends Expr[Bool] {
   def value = implicitly[Ordering[X]].lt(left.value, right.value)
}
...
Run Code Online (Sandbox Code Playgroud)

  • 这是否提供了详尽的匹配(即,如果存在未处理的情况,则会出现编译器错误) (2认同)