Новичок: 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))
}