Прочтите следующий параграф в Программе в Scala, 2nd Edition, который для меня не имеет смысла.Не понимаю, что эффективность отличается в foldLeft и foldRight в Scala
def flattenLeft[T](xss: List[List[T]]) =
(List[T]() /: xss) (_ ::: _)
def flattenRight[T](xss: List[List[T]]) =
(xss :\ List[T]()) (_ ::: _)
Поскольку список конкатенация
xs ::: ys
, занимает время, пропорциональное его первого аргумента хза, реализация с точкой зрения кратного права в flattenRight является более эффективной, чем кратное левой реализации в flattenLeft. Проблема заключается в том, что flattenLeft (XSS) копирует первый элемент списка xss.head п - 1 раз, где п есть длина списка XSS
Таким образом, если список конкатенации занимает время, пропорциональное его первый Аргумент, не так ли? flattenLeft
тем более эффективным, так как его первый аргумент - пустой список и первый аргумент flattenRight
- это список неизвестной длины?