2014-10-22 4 views
5

eine concat-Funktion, wie unten mit foldRight definieren ListeScala: Warum foldLeft kann nicht für eine concat von zwei Liste arbeiten?

def concat[T](xs: List[T], ys: List[T]): List[T] = (xs foldRight(ys))(_ :: _) 

aber dabei mit foldLeft

def concat1[T](xs: List[T], ys: List[T]): List[T] = (xs foldLeft(ys))(_ :: _) 

führt zu einem Kompilierungsfehler value :: is not a member of type parameter T, braucht Hilfe beim Verständnis dieses Unterschiedes richtig verketten kann.

EDIT:

Für den Fall, jemand könnte auf Falten für eine detaillierte Erklärung suchen http://lampwww.epfl.ch/teaching/programmation_avancee/documents/programmation_avancee_5_en-2x2.pdf

Antwort

10

Argumente in foldLeft bestellen, ist nicht das gleiche wie in foldRight.

xs.foldRight(ys){(element, aggregator) => element :: aggregator} 

xs.foldLeft(ys){(aggregator, element) => element :: aggregator} 

mit Platzhalter-Syntax für foldLeft-(_ :: _) - Sie versuchen, etwas zu tun: aggregator :: element. Diese meanselement.::(aggregator) und es gibt keine :: Methode in element (Typ von element ist T).

+1

Wie unterscheiden sie sich konzeptionell und was sind die Szenarien, die ich ihnen –

+3

@SomasundaramSekar einen Blick auf die Dokumentation würde beantworten können. Auch http://StackOverflow.com/Questions/6253978/Difference-between-Fold-and-FoldLeft-Or-ForLight und http://StackOverflow.com/Questions/1446419/How-Do-You-Know-When-to -use-falten-links-und-wenn-zu-verwenden-falten-rechts –

+1

@SomasundaramSekar 'FoldLeft' ist natürlicher für List. 'foldRight' erfordert zuerst das Umkehren der Liste und es ist langsamer. – ZhekaKozlov