2011-09-14 2 views
22

どのようにしてスカラにF#でDiscriminated Unionの変換については行くだろう:F#でのScalaのDiscriminated Unionのカウンターパートとは何ですか?

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を話して同様のポストはあるが、それは私が後だ何をしていないようです。これは、(多分残念ながら、それはより冗長であるように)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 
... 

に行われ

答えて

34

あなたは

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)) 
    ... 
} 

のvalueOfてしまうマッチングさらに

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] 

パターンを入力することができExprのメソッドとしておそらく良いでしょう

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) 
} 
... 
+0

本当に迅速かつ本当に私の質問に答えました。ありがとうございました! –

関連する問題