scala - 键入以捕获整数、 float 或字符串值,然后在 Scala 中进行模式匹配

标签 scala functional-programming pattern-matching ocaml

在 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 - 键入以捕获整数、 float 或字符串值,然后在 Scala 中进行模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33384189/

相关文章:

ios - 任何使用 Scala 进行 iOS 编码的方法?

scala 在运行时动态读取配置

java - 类型翻译问题

java - java/scala/etc 代码可以判断它何时被 tomcat 运行吗?

binary - Erlang 二进制模式匹配失败

java - 从嵌套列表创建 map

javascript - 在不影响所有对象字段的情况下映射对象数组

.net - 在有区别的联合中F#中使用and关键字

F# 模式匹配直接针对 let 绑定(bind)

python - 测试字符串中字符的所有实例是否在 Python 中都是连续的