如何将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,但这似乎不是我所追求的。
答案 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