Новичок: Scala псевдоним типа в Scala 2.10?

Почему этот код не скомпилирован с ошибкой: не найден: значение Матрица? Из документации и некоторых (возможно устаревших) примеров кода это должно работать?

object TestMatrix extends App{  
type Row = List[Int]
type Matrix = List[Row]


val m = Matrix( Row(1,2,3),
                Row(1,2,3),
                Row(1,2,3)
              )


}

Ответ 1

Matrix обозначает тип, но вы используете его как значение.

Когда вы выполняете List(1, 2, 3), вы на самом деле вызываете List.apply, который является factory для List.

Чтобы исправить вашу компиляционную ошибку, вы можете определить свои собственные заводы для Matrix и Row:

object TestMatrix extends App{  
  type Row = List[Int]
  def Row(xs: Int*) = List(xs: _*)

  type Matrix = List[Row]
  def Matrix(xs: Row*) = List(xs: _*)

  val m = Matrix( Row(1,2,3),
      Row(1,2,3),
      Row(1,2,3)
      )
}

Ответ 2

Из этой вашей статьи.

Обратите внимание, что наряду с большинством псевдонимов типов в пакете scalaпоявляется псевдоним значения с тем же именем. Например, существует тип псевдоним для класса List и псевдоним значения для объекта List.

Решение проблемы переводится на:

object TestMatrix extends App{  
  type Row = List[Int]
  val Row = List
  type Matrix = List[Row]
  val Matrix = List

  val m = Matrix( Row(1,2,3),
                  Row(1,2,3),
                  Row(1,2,3))
}