键入以捕获整数,浮点值或字符串值,然后在Scala中执行模式匹配

And*_*viz 2 ocaml functional-programming scala pattern-matching

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

type univ = I of int | F of float | S of string ;;
Run Code Online (Sandbox Code Playgroud)

为了创建这样的对象:

let pol_list = [I 3; F 4.3; S "potato"; I 4];;
Run Code Online (Sandbox Code Playgroud)

然后进行模式匹配以提取某个属性(值或长度取决于具体情况),如下所示:

let get_value val =
  match val with
  | I v -> v
  | F v -> (int_of_float v)
  | S s -> (String.length s)
Run Code Online (Sandbox Code Playgroud)

如何在Scala中完成?如果不可能,还有其他类似的选择吗?

Pet*_*ens 9

我不知道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)
Run Code Online (Sandbox Code Playgroud)