gpt4 book ai didi

scala - Scala 在 F# 中对应的 Discriminated Union 是什么?

转载 作者:行者123 更新时间:2023-12-03 10:56:35 24 4
gpt4 key购买 nike

将如何改造 Discriminated Union在 F# 到 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 ,但这似乎不是我所追求的。

最佳答案

这是通过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))
...
}

valueOf 作为 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)
}
...

关于scala - Scala 在 F# 中对应的 Discriminated Union 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7412923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com