Я реализую некоторые легкие математические векторы в Scala.Я хотел бы использовать систему типов для проверки совместимости векторов во время компиляции.Например, попытка добавить вектор измерения 2 к другому вектору измерения 3 приведет к ошибке компиляции.
До сих пор я определял измерения как классы дел:
sealed trait Dim
case class One() extends Dim
case class Two() extends Dim
case class Three() extends Dim
case class Four() extends Dim
case class Five() extends Dim
Ивот определение векторов:
class Vec[D <: Dim](val values: Vector[Double]) {
def apply(i: Int) = values(i)
def *(k: Double) = new Vec[D]( values.map(_*k) )
def +(that: Vec[D]) = {
val newValues = ( values zip that.values ) map {
pair => pair._1 + pair._2
}
new Vec[D](newValues)
}
override lazy val toString = "Vec(" + values.mkString(", ") + ")"
}
Это решение хорошо работает, однако у меня есть две проблемы:
Как добавить метод dimension():Int
, который возвращаетизмерение (т. е. 3 для Vec[Three]
)?
Как можно обрабатывать более высокие измерения без предварительного объявления всех необходимых классов дел?
PS: Я знаю, что есть хорошие математические векторные библиотеки, я просто пытаюсь улучшить свое понимание scala.