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

时间:2011-09-14 07:49:59

标签: scala f#

如何将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

有一篇类似的帖子谈论ADTs in F# and Scala,但这似乎不是我所追求的。

2 个答案:

答案 0 :(得分: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
...

您可以输入更多

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]

匹配的模式
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))
   ...
}
作为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)
}
...

答案 1 :(得分:2)

我完全同意Didier Dupont,但是如果你需要更高级别的抽象,那么在Scala中实现选项类型会给出一个很好的直觉:

sealed trait Option[+E]

case class Some[+E]( element : E ) extends Option[E]
case object None extends Option[Nothing]

来源:https://mauricio.github.io/2013/12/25/learning-scala-by-building-scala-lists-part-3.html