Abgesehen von den Effizienzaspekten gibt es auch eine pragmatische Seite zu dieser Frage: Was wollen Sie mit dieser Struktur machen?
Möchten Sie zum Beispiel eine leere Map für einen gegebenen Wert vom Typ a
speichern können? Wenn dem so ist, dann könnte die uncurried Version praktischer sein!
Hier ist ein einfaches Beispiel: Nehmen wir an, wir wollen String
-bewertete Eigenschaften von Personen speichern - sagen wir den Wert einiger Felder auf der Stackoverflow-Profilseite dieser Person.
type Person = String
type Property = String
uncurriedMap :: Map Person (Map Property String)
uncurriedMap = fromList [
("yatima2975", fromList [("location","Utrecht"),("age","37")]),
("PLL", fromList []) ]
curriedMap :: Map (Person,Property) String
curriedMap = fromList [
(("yatima2975","location"), "Utrecht"),
(("yatima2975","age"), "37") ]
Mit der curried Version gibt es keine gute Möglichkeit, die Tatsache zu erfassen, dass "PLL"
Benutzer das System bekannt ist, aber in den Informationen nicht gefüllt hat. Ein Personen-/Eigenschaftspaar ("PLL",undefined)
wird Runtime-Abstürze verursachen, da Map
in den Schlüsseln streng ist.
Sie könnten die Art von curriedMap
zu Map (Person,Property) (Maybe String)
ändern und speichern Nothing
s drin, und das sehr gut könnte die beste Lösung in diesen Fall sein; aber wo es eine unbekannte/variierende Anzahl von Eigenschaften (z. B. abhängig von der Art der Person) gibt, die auch in Schwierigkeiten geraten wird.
Also, ich denke, es hängt auch davon ab, ob Sie eine Abfrage Funktion wie diese benötigen:
data QueryResult = PersonUnknown | PropertyUnknownForPerson | Value String
query :: Person -> Property -> Map (Person, Property) String -> QueryResult
Das ist schwer zu schreiben (wenn nicht unmöglich) in der curried Version, aber leicht in der uncurried Version.
Ich denke, Map (a, b) c ist wahrscheinlich viel mehr Speicher (und möglicherweise Zeit) effizient. Wenn es einen Weg gibt (ich bin mir nicht sicher, habe Karten nicht viel benutzt), um einen Präfix-Schlüsselbereich zu falten, dann könnte man mit dieser Darstellung, wie ich meine, immer noch so etwas wie eine Curry-Anwendung ausführen. – DarkOtter