键入以捕获整数、浮点数或字符串值,然后在 Scala 中进行模式匹配
Type to capture either integer, float or a string value and then do pattern matching in Scala
在 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 中如何完成?如果不行,是否还有其他类似的选择?
也许是这样的:
val mix = List(1, "foo", 4.5)
val normalized = for (e <- mix) yield {
e match {
case s: String => s.length
case i: Int => i
case d: Double => d.toInt
}
}
println(normalized)
List(1, 3, 4)
我不知道 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)
在 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 中如何完成?如果不行,是否还有其他类似的选择?
也许是这样的:
val mix = List(1, "foo", 4.5)
val normalized = for (e <- mix) yield {
e match {
case s: String => s.length
case i: Int => i
case d: Double => d.toInt
}
}
println(normalized)
List(1, 3, 4)
我不知道 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)