Ich habe ein Modul, das auf Wegen arbeitet, die als Listen dargestellt werden. Die meisten Funktionen machen eine typische rekursive Listenverarbeitung, aber jetzt brauche ich eine, die manchmal einen Pfad mutiert. Also habe ich diese replace
Funktion geschrieben:
%Vor%
was so funktioniert:
%Vor%Wenn ich das Bedürfnis habe, ein eingebautes Modul zu erweitern, merke ich schließlich, dass ich etwas Eigenartiges oder Ineffizientes mache. Ersetzt ein Listenelement eines dieser Dinge? Gibt es einen einfacheren (ebenso effizienten) Weg, dies zu tun?
Wenn O(N)
complexity für Ihre Anwendung akzeptabel ist, ist Ihr Code perfekt. Für eine bessere Komplexität möchten Sie die Notwendigkeit einer linearen Suche umgehen, indem Sie beispielsweise den Elementen eine Reihenfolge zuweisen und binäre Suchbäume verwenden.
Ein ähnliches Problem, das keine Suche beinhaltet, ist das Ersetzen eines Listenelements durch einen bekannten Index:
%Vor%Für dieses Problem existieren bessere persistente Datenstrukturen als die Standardliste. Suche nach rein funktionalen Random-Access-Listen in der Literatur.
Seltsamerweise definiert keine ML-Familiensprache (OCaml, F #, SML) replace
oder replaceAt
in der Standardlistenbibliothek. Dies soll Benutzer dazu anregen, ihren Code neu zu gestalten, um die Komplexität dieser Operationen zu vermeiden.
Tags und Links f# list anti-patterns