В Scala вы обычно используете case class
es для эмуляции алгебраических типов данных, которые можно найти в функциональных языках истинно синего цвета, таких как ML и Haskell.
Например, следующий код F # (взятый из здесь ):
type Shape =
| Circle of float
| EquilateralTriangle of double
| Square of double
| Rectangle of double * double
let area myShape =
match myShape with
| Circle radius -> Math.PI * radius * radius
| EquilateralTriangle s -> (sqrt 3.0) / 4.0 * s * s
| Square s -> s * s
| Rectangle (h, w) -> h * w
можно примерно перевести на Scala следующим образом:
sealed abstract class Shape
case class Circle(radius: Float) extends Shape
case class EquilateralTriangle(side: Double) extends Shape
case class Square(side: Double) extends Shape
case class Rectangle(height: Double, width: Double) extends Shape
def area(myShape: Shape) = myShape match {
case Circle(radius) => math.Pi * radius * radius
case EquilateralTriangle(s) => math.sqrt(3.0) / 4.0 * s * s
case Square(s) => s * s
case Rectangle(h, w) => h * w
}
Приведенное выше ключевое слово sealed
используется, чтобы компилятор предупреждал вас в случае, если вы забудете какой-либо case
в выражении match
.