Fassen Sie eine Liste von Haskell-Datensätzen zusammen

8

Nehmen wir an, ich habe eine Liste von Datensätzen und möchte sie zusammenfassen, indem ich den Median anstelle. Konkreter gesagt, ich habe

%Vor%

Ich habe eine Liste von Messungen, und ich möchte es in einen Median Location zusammenfassen, also etwas wie:

%Vor%

Das ist in Ordnung, aber was ist, wenn ich etwas verschachteltes habe, wie zum Beispiel:

%Vor%

Ich habe eine Liste von CampusLocation s und möchte eine Zusammenfassung CampusLocation , wobei der Median rekursiv auf alle Felder angewendet wird.

Was ist der sauberste Weg, dies in Haskell zu tun? Linsen? Uniplate?

Bearbeiten: Bonus:

Was wäre, wenn statt eines Datensatzes, der Felder enthält, die wir zusammenfassen möchten, wir stattdessen eine implizite Liste haben? Zum Beispiel:

%Vor%

Wie können wir eine [ComplexCampus] in eine ComplexCampus zusammenfassen, unter der Annahme, dass jede buildings die gleiche Länge hat?

    
yong 28.08.2014, 03:49
quelle

1 Antwort

4

Hier ist eine Implementierung von summarize :: [ComplexCampus] -> ComplexCampus , die Objektive mit Uniplate verwendet (wie Sie erwähnt haben), um eine Liste von ComplexCampus mit einem einzelnen ComplexCampus zusammenzufassen.

%Vor%

Die Verwendung von biplate ist hier wahrscheinlich übertrieben, aber unabhängig von averageLoc verwenden wir biplate in der Liste der Orte, um alle x -Felder und alle y -Felder zu erhalten. Wenn Sie eine ComplexCampus in eine einzelne Location zusammenfassen möchten, können Sie biplate verwenden, um alle x -Werte und alle y -Werte von der obersten Ebene ComplexBuilding zu extrahieren.

Zum Beispiel:

campusLocs' ^.. biplate . x gibt uns alle x Werte und campusLocs' ^.. biplate . y gibt uns alle y Werte

Um alle Standorte zu erhalten, könnten wir auch einfach Folgendes tun:

(campusLocs' ^.. biplate) ::[Location]

Oder, wenn wir jedes Double wollten: (campusLocs' ^.. biplate) ::[Double]

    
jek 28.08.2014, 06:18
quelle

Tags und Links