Unterschied zwischen list.map und list.collect

8

Was ist der Unterschied zwischen map und collect? Dokumentation unten - ich kann den Unterschied nicht sagen ..

List.map & lt; 'T', U & gt; Funktion

Erstellt eine neue Sammlung, deren Elemente die Ergebnisse der Anwendung der gegebenen Funktion auf jedes Element der Sammlung sind.

// Unterschrift: List.map: ('T - & gt;' U) - & gt; T-Liste - & gt; 'U-Liste

List.collect & lt; 'T', U & gt; Funktion

Für jedes Element der Liste gilt die angegebene Funktion. Verkettet alle Ergebnisse und gibt die kombinierte Liste zurück.

    
Carlo V. Dango 14.09.2013, 11:01
quelle

3 Antworten

10

Der Unterschied besteht darin, dass die Ausgabeliste von map dieselbe Länge wie die Eingabeliste hat. Für collect kann die Ausgabeliste länger oder kürzer als die Eingabe sein, da die übergebene Funktion eine Liste anstelle eines einzelnen Elements zurückgibt.

Für mehr Details - vergleichen Sie die Signaturen. Für map

%Vor%

und sammeln

%Vor%

Sie können hier sehen, dass der Rückgabetyp des Funktionsarguments anders ist.

    
John Palmer 14.09.2013, 11:02
quelle
12

Ein Beispiel zur Veranschaulichung

Nehmen wir an, Sie haben eine Liste von Listen:

let list = [ [1; 2]; [3; 4]; [5; 6] ]

Und eine Transformationsfunktion:

let trans = fun x -> [for i in x -> i*10]

List.map trans list erzeugt:

[[10; 20]; [30; 40]; [50; 60]]

Während

List.collect trans list erzeugt:

[10; 20; 30; 40; 50; 60]

List.collect wird die Transformationsfunktion anwenden und Concatenate das Ergebnis, während List.map nur die Transformationsfunktion anwendet.

    
polkduran 14.09.2013 18:40
quelle
9

Zu @ Johns Antwort hinzufügen, ist der Unterschied in dem Wort Concatenates .

Grundsätzlich ist List.collect f xs dasselbe wie List.concat (List.map f xs) .

    
MisterMetaphor 14.09.2013 12:40
quelle

Tags und Links