Scala списки использования "var" - PullRequest
3 голосов
/ 12 марта 2020

Я все еще относительно новичок в Scala. Я просматривал реализацию List Scala, где я увидел, что многие функции все еще используют «var» в реализации. Я читал, как scala является более функционально-ориентированным, поэтому вместо использования «var» библиотека не должна использовать хвостовую рекурсию, где это возможно.

Например, exits может быть переписан как:

@tailrec
def exists[A](f : A => Boolean) : Boolean = this match {
    case Nil => false
    case l:LinearSeq[A]=> if (f(l.head)) true else exists(l.tail,f)
}

Причина, по которой я спрашиваю, заключается в том, что я читаю много материала, в котором не рекомендуется использовать «var», но я вижу, что многое из этого используется в реализации List.

Спасибо !

Ответы [ 3 ]

5 голосов
/ 12 марта 2020

Когда у вас есть что-то вроде List, которое очень часто используется почти в каждой программе Scala:

  1. даже очень незначительное ускорение (или замедление) может иметь большое кумулятивный эффект;

  2. его участниками, как правило, являются те, кто много знает о Scala деталях низкого уровня (и если некоторые не знают, их патчи будут проверены теми, кто знает).

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

Для этого конкретного c примера: @tailrec не существовало до Scala 2.8, этот код, вероятно, был написан ранее (я не проверял), и нет достаточных оснований для его перезаписи.

4 голосов
/ 12 марта 2020

Разработчики стандартной библиотеки предпочли производительность, а не чистоту.

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

A Вторым недостатком является то, что это уменьшает стимул для компилятора оптимизировать чистый функциональный код, поскольку он не влияет на библиотеку ядра.

2 голосов
/ 12 марта 2020

Тупой причиной обычно является производительность. С учетом того, что локальные (!) var s не нарушают FP и по-прежнему допускают параллелизм.

В этом случае причина, вероятно, другая. Реализация работает также для не-списков, только с использованием методов IterableOnce.

...