Как скала. Массив Seq? - PullRequest
7 голосов
/ 29 мая 2011

Я сильный Java-разработчик, который совсем недавно начал пытаться использовать Scala в свое свободное время. Я просматриваю Scala на примере PDF с scala-lang.org, и меня смущает, как работает Быстрая сортировка в самом первом примере. Вот код:

object QuickSort extends App {

  def sort(input: Array[Int]): Array[Int] = {
    if(input.length <= 1) input
    else
    {
      val pivot = input(input.length / 2)
      Array.concat(
          sort(input filter (pivot >)),
               input filter (pivot ==),
          sort(input filter (pivot <))
      )
    }
  }

  sort(Array(5, 4, 3, 2, 1)) foreach println
}

Мой вопрос не о синтаксисе или чем-то еще, но я запутался в том, откуда взялась функция фильтра. Согласно PDF, в нем говорится, что он происходит из класса Seq [T] и что все массивы являются экземплярами Seq [T]. Это все прекрасно, и, читая PDF, я остался доволен и очень доволен новичком в Scala. Но потом я покопался немного глубже и начал смотреть на scaladoc для Array [T] , а также на исходный код Array [T], и я не вижу, как класс Array [T] расширяет или наследует Seq [T] черта вообще. Чего мне не хватает?

Ответы [ 2 ]

10 голосов
/ 29 мая 2011

Вам не хватает замешательств. Существует несколько вопросов о последствиях переполнения стека. В документе PDF, который вы читаете, см. Главу 15, начиная со страницы 113. В Scaladoc вы увидите соответствующие последствия для объекта scala.Predef - просто найдите неявные методы, которые принимают Array в качестве входного параметра и возвращают что-то еще.

PS: Да, это говорит, что Array - это Seq! На самом деле это могло бы быть до Scala 2.8, но с тех пор Array - это Java Array, чистый и простой.

3 голосов
/ 29 мая 2011

Существует неявное преобразование в WrappedArray в Predefs.См. Scala Arrays vs Vectors .

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