Ранее Николас Ринаудо ответил на мой вопрос о Scala Список foldRight Always Using foldLeft?
Изучая Haskell в настоящее время, я понимаю, что foldRight
должен быть предпочтительнее foldLeft
в случаях, когда ::
(preend) можно использовать над ++
(append).
Причиной, как я понимаю, является производительность - первое происходит в O(1)
, т.е. добавляет элемент к фронту - постоянное время. В то время как для последнего требуется O(N)
, т.е. Пройти весь список и добавить элемент.
В Scala, учитывая, что foldLeft
реализуется в терминах foldRight
, имеет ли значение использование :+
над ++
с foldRight
значение, поскольку foldRight
обращается вспять, а затем foldLeft'd
?
В качестве примера рассмотрим эту простую операцию fold..
для простого возврата элементов списка в порядок.
foldLeft
складывается над каждым элементом, добавляя каждый элемент в список через :+
.
scala> List("foo", "bar").foldLeft(List[String]()) {
(acc, elem) => acc :+ elem }
res9: List[String] = List(foo, bar)
foldRight
выполняет операцию foldLeft с оператором ::
для каждого элемента, но затем меняет направление.
scala> List("foo", "bar").foldRight(List[String]()) {
(elem, acc) => elem :: acc }
res10: List[String] = List(foo, bar)
В действительности, имеет значение в Scala, который используется foldLeft
или foldRight
, учитывая, что foldRight
использует foldRight
?