在Ocaml中,可以定义如下内容:

type univ = I of int | F of float | S of string ;;

为了创建这样的对象:
let pol_list = [I 3; F 4.3; S "potato"; I 4];;

然后执行模式匹配以提取特定属性(值或长度取决于大小写),如下所示:
let get_value val =
  match val with
  | I v -> v
  | F v -> (int_of_float v)
  | S s -> (String.length s)

在Scala中如何做到这一点?如果不可能,还有其他类似的选择吗?

最佳答案

我不知道OCaml,但univ似乎是一种代数数据类型,您可以在带有密封特征和某些案例类的Scala中进行建模(比OCaml更为冗长):

sealed trait Univ extends Product with Serializable
case class I(i: Int) extends Univ
case class F(f: Float) extends Univ
case class S(s: String) extends Univ

val polList = List(I(3), F(4.3f), S("potato"), I(4))

def getValue(v: Univ): Int = v match {
  case I(i) => i
  case F(f) => f.toInt
  case S(s) => s.length
}

polList.map(getValue) // List[Int] = List(3, 4, 6, 4)

关于scala - 键入以捕获整数,浮点数或字符串值,然后在Scala中进行模式匹配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33384189/

10-09 09:28