Scala 中是否有像 Ocaml 一样的可扩展变体类型的函数方法?

问题描述 投票:0回答:1

在 Ocaml 中您可以执行以下操作:

type attr = ..

type attr += Str of string

type attr +=
    | Int of int
    | Float of float

Scala 中有这个版本吗?

我知道有一种方法可以用类来实现这一点,如this帖子中所示,但是有没有办法做到这一点,使其保持功能性程序?

我希望能够在完全不同的文件中添加此类型,而不必修改早期的代码。

scala functional-programming
1个回答
0
投票

在 scala 3 中:

type SomeType = Int | Double
type RicherType = SomeType | String | List[Int]

def process(value: RicherType): Unit = value match {
  case i: Int        => println(s"Integer: $i")
  case d: Double     => println(s"Double: $d")
  case s: String     => println(s"String: $s")
  case l: List[Int]  => println(s"List of Ints: $l")
}

在 scala 2 中:

sealed trait SomeType
case class IntType(value: Int) extends SomeType
case class DoubleType(value: Double) extends SomeType

sealed trait RicherType
case class StringType(value: String) extends RicherType
case class IntListType(value: List[Int]) extends RicherType
case class SomeTypeWrapper(value: SomeType) extends RicherType

def process(value: RicherType): Unit = value match {
  case IntType(i)                     => println(s"Integer: $i")
  case DoubleType(d)                  => println(s"Double: $d")
  case StringType(s)                  => println(s"String: $s")
  case IntListType(l)                 => println(s"List of Ints: $l")
  case SomeTypeWrapper(IntType(i))    => println(s"Wrapped Integer: $i") 
  case SomeTypeWrapper(DoubleType(i)) => println(s"Wrapped Double: $d")
}
© www.soinside.com 2019 - 2024. All rights reserved.