如何将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)
| 归档时间: |
|
| 查看次数: |
2463 次 |
| 最近记录: |