2015-07-12 2 views
1
реализация

Scala foldLeft является:Список foldLeft в Scala

def foldLeft[B](z: B)(op: (B, A) => B): B = { 
    var result = z 
    this foreach (x => result = op(result, x)) 
    result 
} 

Почему Scala develovers не использовать что-то вроде хвоста рекурсии или что-то другое, как это (это просто пример):

def foldLeft[T](start: T, myList: List[T])(f:(T, T) => T): T = { 
    def foldRec(accum: T, list: List[T]): T = { 
    list match { 
     case Nil => accum 
     case head :: tail => foldRec(f(accum, head), tail) 
    } 
    } 
    foldRec(start, myList) 
} 

Может ли так быть? Почему, если он не может/может?

+3

Я не уверен, что все эти «почему эта библиотека Scala написана так?» вопросы очень полезны, даже если рассматриваемая библиотека является стандартной библиотекой. Вероятно, они лучше подходят для одного из списков рассылки Scala или для чата Scala/Scala Gitter. –

ответ

0

В соответствии с ответом this Scala поддерживает оптимизацию хвостовой рекурсии, но похоже, что ее не было с самого начала, и она может все еще не работать в каждом случае, так что конкретная реализация может быть остаточной.

Это говорит о том, что Scala - это мультипарадигма, и я не думаю, что она стремится к чистоте с точки зрения ее функционального программирования, поэтому я не удивлюсь, если они подойдут для наиболее практичного или удобного подхода.

2

«Почему бы не заменить эту простую трехстрочную часть кода этой менее простой семистрочной частью кода, которая делает то же самое?»

Um. Вот почему.

(Если вы спрашиваете о производительности, то нужно было бы ориентиры обоего решений и указание о том, что версия неушивания значительно быстрее была.)

0

Кроме императив решения проще, но и намного больше Генеральная. Как вы могли заметить, foldLeft реализован в TraversableOnce и зависит только от метода foreach. Таким образом, расширяя Traversable и реализуя foreach, который, вероятно, является самым простым методом для реализации в любой коллекции, вы получаете все эти замечательные методы.

С другой стороны, декларативная реализация является рефлексивной по структуре Перечня и очень специфична, поскольку она зависит от Nil и ::.

Смежные вопросы