Ich habe eine Frage bezüglich Data.List und der Signatur von deleteBy . Im Idealfall sollte diese Funktion ein Prädikat eingeben und das erste Element löschen, für das das Prädikat wahr ist. Etwas wie:
%Vor%Stattdessen verwendet die in der Bibliothek definierte Funktion sowohl ein Prädikat als auch einen Wert:
%Vor% Es ist leicht zu sehen, dass eq
immer mit x
als erstes Argument und x
in deleteBy
verwendet wird, also gibt es keinen Grund, sowohl eq
als auch x
statt% zu erhalten Code%. Im Gegensatz dazu können Prädikate, die keine zwei Werte vergleichen, wie eine Funktion, die auf einen Teil vom Typ eq x
oder eine triviale Funktion wie a
wirkt, übergeben werden, indem ein Prädikat verwendet wird, das an einem einzelnen Element arbeitet. Meine Frage ist: Warum wurde cons true
auf diese Weise implementiert?
Die Funktion deleteBy
ist eine Verallgemeinerung von delete
. Daher ist es hilfreich, zuerst delete
zu betrachten.
delete
nimmt einen Wert Eq a => a
und löscht dann das erste Vorkommen dieses Wertes aus dem [a]
mit dem (==)
aus der Eq
Instanz.
Wie bei allen *By
Funktionen in Daten. Liste , die Einschränkung Eq
wird entfernt und der Programmierer muss seine eigene (==)
-Funktion bereitstellen.
Wenn Sie also die Eq
Einschränkung von delete
entfernen und sie durch den Typ (==)
, nämlich a -> a -> Bool
, ersetzen, erhalten Sie den Typ deleteBy
.
Mit anderen Worten, es ist konsistent mit dem Rest der *By
-Operationen in Data.List
.
Wie cdk und andere darauf hinweisen. Es ist über das Gleichheitsprädikat zu verallgemeinern.
Die Funktion, nach der Sie fragen, ist 'lösche Elemente in der Liste, die mit diesem Prädikat übereinstimmen'. Dies entspricht eher dem Einzelelement filter
.
Die Funktion deleteBy
ist 'lösche Element x, aber benutze diesen Vergleichsoperator anstelle von (==)
'.
Tags und Links haskell