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:
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?
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.
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]