Warum verwendet Haskells Data.List.deleteBy eine Vergleichsfunktion (a - a - Bool) und einen Wert anstelle eines Prädikats (a - Bool)?

8

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?

    
mariop 10.04.2014, 23:06
quelle

2 Antworten

11

Die Funktion deleteBy ist eine Verallgemeinerung von delete . Daher ist es hilfreich, zuerst delete zu betrachten.

%Vor%

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 .

    
cdk 10.04.2014, 23:49
quelle
0

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 (==) '.

    
Andrew Farmer 17.04.2014 13:49
quelle

Tags und Links