Как я могу вызвать метод для этих векторов внутри цикла? - PullRequest
1 голос
/ 30 сентября 2019

Я пытаюсь выполнить упражнение 1 из Два резюме в Атомной Скале.

Почему следующий код работает нормально

val chars = Vector('z', 'a', 'b')
val ints = Vector(0, 3, 7)
val strs = Vector("these", "are", "vectors")

println(chars.sorted)
println(ints.sorted)
println(strs.sorted)

, но следующий скрипт выдает ошибку .\Summary2.scala:7: error: No implicit Ordering defined for Any. println(v.sorted)

val chars = Vector('z', 'a', 'b')
val ints = Vector(0, 3, 7)
val strs = Vector("these", "are", "vectors")

for (v <- Vector(chars, ints, strs)){
    println(v.sorted)
}

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

val chars:Vector[Char] = Vector('z', 'a', 'b')
val ints:Vector[Int] = Vector(0, 3, 7)
val strs:Vector[String] = Vector("these", "are", "vectors")

for (v <- Vector(chars, ints, strs)){
    println(v)
    // println(v.sorted)
}

Я получаю этот вывод

Vector(z, a, b)
Vector(0, 3, 7)
Vector(these, are, vectors)

Это довольно просто, и официальное книжное решение - первый сценарий, но меня действительно раздражает, что второй сценарий не работает.

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Scala является строго типизированным языком, поэтому во время компиляции компилятор должен знать, что это за тип, чтобы создать правильную программу.

Давайте посмотрим, что scala считает типом ваших векторов

scala> val chars = Vector('z', 'a', 'b')
chars: scala.collection.immutable.Vector[Char] = Vector(z, a, b)

scala> val strs = Vector("these", "are", "vectors")
strs: scala.collection.immutable.Vector[String] = Vector(these, are, vectors)

scala> val ints = Vector(0, 3, 7)
ints: scala.collection.immutable.Vector[Int] = Vector(0, 3, 7)

scala> val vs = Vector(chars, ints, strs)
vs: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Any]] = Vector(Vector(z, a, b), Vector(0, 3, 7), Vector(these, are, vectors))

Как вы можете видеть, вектор, который вы создали для итерации, имеет тип

scala.collection.immutable.Vector[Any]

Чтобы быть сортируемым, мы должны иметь возможность определить <, <=, >, >= и, как выКак видно из определения класса Any, этот тип реализует только !=, ==

Таким образом, мы не можем отсортировать объект с типом Any, потому что, используя только операторы равенства, а не операторы равенства, мы непонять, что такое правильный порядок.

https://www.scala -lang.org / api / 2.7.5 / scala / Any.html

0 голосов
/ 30 сентября 2019

Эта проблема относится к способу реализации sorted, потому что sorted фактически принимает параметр, чтобы сказать, как данные должны быть отсортированы:

def sorted[T](implicit ord: Ordering[T]) = ???

Значение ord указывает на сортировкуАлгоритм правильного порядка для значений типа T. Но это параметр implicit, означающий, что он будет автоматически предоставлен компилятором, если он сможет увидеть подходящую область implicit val.

По умолчанию для сортировки стандартных типов доступны соответствующие значения:

implicit val orderChar: Ordering[Char] = ???
implicit val orderInt: Ordering[Int] = ??
implicit val orderString: Ordering[String] = ??

Это означает, что отдельные вызовы на sorted в порядке для разных Vector с.

Когда вы помещаете разные Vectors во вложенный Vector типэто Vector[Vector[Any]], потому что Any является распространенным супертипом Char, Int и String. К сожалению, нет подходящего значения для ord

implicit val orderAny: Ordering[Any] // DOES NOT EXIST

Это, в свою очередь, означает, что Vector[Any].sorted завершится неудачно с ошибкой

Не определено неявное упорядочение для Any

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