Ранее Николас Ринаудо ответил на мой вопрос о 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?