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中完成?如果不可能,还有其他类似的选择吗?
我不知道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)
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |