тип scala: значение не является ошибкой члена - PullRequest
0 голосов
/ 24 января 2011

Это продолжение этого вопроса .

Я пытаюсь реализовать векторы в scala с помощью универсального суперкласса, используя собственные типы:

trait Vec[V] { self:V =>
  def /(d:Double):Vec[V] 
  def dot(v:V):Double

  def norm:Double = math.sqrt(this dot this)
  def normalize = self / norm
}

Вот реализация трехмерного вектора:

class Vec3(val x:Double, val y:Double, val z:Double) extends Vec[Vec3]
{
  def /(d:Double) = new Vec3(x / d, y / d, z / d)
  def dot(v:Vec3) = x * v.x + y * v.y + z * v.z 
  def cross(v:Vec3):Vec3 = 
  {
      val (a, b, c) = (v.x, v.y, v.z)
      new Vec3(c * y - b * z, a * z - c * x, b * x - a * y)
  }

  def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
}

К сожалению, это не компилируется:

Vec3.scala:10: error: value cross is not a member of Vec[Vec3]
  def perpTo(v:Vec3) = (this.normalize).cross(v.normalize)
                                        ^

Что не так, и как это исправить?

Кроме того, любые ссылки на самотипы приветствуются, потому что я думаю, что эти ошибки возникают из-за моего непонимания.

Ответы [ 2 ]

9 голосов
/ 24 января 2011

Чтобы избавиться от всей злобности, вы должны указать, что параметр типа V является подклассом Vec.Теперь вы можете просто использовать V везде, потому что ваша черта знает, что V наследует все Vec[V] методы.

trait Vec[V <: Vec[V]] { self: V =>
  def -(v:V): V
  def /(d:Double): V
  def dot(v:V): Double

  def norm:Double = math.sqrt(this dot this)
  def normalize: V = self / norm
  def dist(v: V) = (self - v).norm
  def nasty(v: V) = (self / norm).norm
}

Обратите внимание на метод nasty, который не будет компилироваться с EasyПодход ангела .

3 голосов
/ 24 января 2011

Я думаю, что метод / в Vec должен возвращать V вместо Vec[V]:

trait Vec[V] { self:V =>
  def /(d:Double): V
  def dot(v:V):Double

  def norm:Double = math.sqrt(this dot this)
  def normalize = self / norm
}

Крест метода существует в Vec3 (или другими словами в V) но не в Vec[V]

...