В Scala, что делает "просмотр"?
В частности, я рассматриваю проблему 1 здесь
http://pavelfatin.com/scala-for-project-euler/
Указанный ниже код выглядит следующим образом
val r = (1 until 1000).view.filter(n => n % 3 == 0 || n % 5 == 0).sum
Я могу следить за всем, кроме "представления". Фактически, если я выберу представление, код все еще компилируется и дает точно такой же ответ.
Ответы
Ответ 1
View создает ленивую коллекцию, так что вызовы, например, filter
не оценивать каждый элемент коллекции. Элементы оцениваются только после их прямого доступа. Теперь sum
выполняет доступ ко всем элементам, но с view
вызов filter
не создает полный вектор. (См. Комментарий от Стива)
Хорошим примером использования вида будет:
scala> (1 to 1000000000).filter(_ % 2 == 0).take(10).toList
java.lang.OutOfMemoryError: GC overhead limit exceeded
Здесь Scala пытается создать коллекцию с элементами 1000000000
, чтобы получить доступ к первому 10. Но с представлением:
scala> (1 to 1000000000).view.filter(_ % 2 == 0).take(10).toList
res2: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
Ответ 2
Я мало что знаю о Scala, но, возможно, эта страница может помочь...
Существует два основных способа реализации трансформаторов. Один из них строгий, то есть новая коллекция со всеми ее элементами построена в результате трансформатора. Другой - нестрогий или ленивый, то есть один создает только прокси-сервер для сбора результатов, а его элементы создаются только по требованию.
A view - это особый вид коллекции, который представляет собой базовую коллекцию, но лениво реализует все трансформаторы.
Так звучит так, как будто код будет работать без view
, но теоретически можно сделать некоторую дополнительную работу, строя все элементы вашей коллекции строгим, а не ленивым способом.