Как бы я написал класс Vector в Scala? - PullRequest
0 голосов
/ 26 января 2019

Я бы хотел, чтобы он имел характеристики производительности и включал большинство методов Array [Double], но имел дополнительные методы расширения, такие как dotProduct (), +, - и т. Д. Я могу написать дополнительные методы расширения, но мне нужна помощь на реализацию существующих черт и мер, необходимых для получения Array, как производительность.

class Vec(private val content:Array[Double]) extends WrappedArray[Double] {
  /* Trait implementation methods - incomplete */
  def array = content
  def apply(i:Int) = content(i)
  def length = content.length
  def update(i:Int, v:Double) = content.update(i, v)
  def elemTag = ???

  /* Example extension methods */
  def plus(that:Vec) = Vec(this.indices.map{ i => this(i) + that(i)})
  def elementProduct(that:Vec) = Vec(this.indices.map{ i => this(i) * that(i)})
  def sum = content.sum
  def dotProduct(that:Vec) = elementProduct(that).sum
}

object Vec {
  def apply(seq:IndexedSeq[Double]) = new Vec(seq.toArray)
}

1 Ответ

0 голосов
/ 26 января 2019

Если вы просто хотите Array[Double] с некоторыми новыми методами, тогда лучший способ сделать это - определить неявный класс , который предоставляет дополнительные методы.Примерно так:

implicit class ArrayOps(vec: Array[Double]) {
  def plus(that: Array[Double]): Array[Double] =
    vec.indices.map(i => vec(i) + that(i))(collection.breakOut)

  def elementProduct(that: Array[Double]): Array[Double] =
    vec.indices.map(i => vec(i)*that(i))(collection.breakOut)

  def dotProduct(that: Array[Double]): Double =
    (vec elementProduct that).sum
}

Вы можете затем вызвать plus, elementProduct и dotProduct на любом Array[Double], и он выполнит соответствующую операцию с implicit class.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...