@ специализированная дополнительная информация - PullRequest
0 голосов
/ 31 октября 2018

Я пытаюсь реализовать универсальные функции, работающие с различными типами векторов, которые могут быть вещественными, двоичными и смешанными. Mixt обернуты внутри класса, состоящего из вещественной и двоичной частей.

import spire.math.{Numeric => SNumeric}

// basic function working on any kind of vectors
def f[O, D <: Distance[O]](data: GenSeq[O], metric: D) = ...

// function working on real and binary vectors
def f[@specialized(Int, Double) N: SNumeric, V[N] <: Seq[N], D <: DistanceSeq[N, V[N]]](data: GenSeq[V[N]], metric: D) = ...

, где

// general distance definition
trait Distance[O] extends Serializable {
  def d(o1: O, o2: O): Double
}

// Real and binary distance definitions
trait DistanceSeq[@specialized(Int, Double) N, V <: Seq[N]] extends Distance[V]

Эффективно ли специализации f и DistanceSeq ускоряют методы приложений при их вызове? Есть ли лучший способ реализовать это?

Я также хотел бы знать, если я вызываю f без соответствующих универсальных аргументов, автоматически ли он выбирает очень специализированный метод или мне нужно указать универсальные аргументы, чтобы он выбрал лучший.

...