2016-07-27 13 views
1

Gibt es eine offen gelegte Funktion zum Entfernen eines Elements aus einer Liste?Gibt es eine exposed-Funktion zum Entfernen eines Elements aus einer Liste?

Ich sehe keine Operation zum Entfernen eines Elements aus einer Liste.

Ich bin mir sicher, dass ich diese Funktionalität selbst implementieren kann. Ich habe jedoch erwartet, dass diese Operation in FSharp.Core unterstützt wird.

Fehle ich etwas?

+6

Soweit ich verstehe, verwendet funktionale Sprachen unveränderliche (schreibgeschützte) Daten. Stattdessen sollten Sie stattdessen eine neue Liste erstellen und unerwünschte Elemente filtern. –

+2

'List.filter' mit einer Negation? –

+0

@MarkShevchenko Das habe ich mit Pattern Matching umgesetzt. Ich erwarte nur, dass dies in den Rahmen aufgenommen wird. –

Antwort

5

Kurze Antwort - die Bibliotheksdesigner glaubten nicht, dass dies eine Inklusion gewährleiste.

Beim Entwerfen einer Bibliothek jeder Art, insbesondere aber einer Kernbibliothek wie Auflistungsmodulen in F #, geht es immer darum, das richtige Gleichgewicht zwischen Komplexität und Nützlichkeit zu finden. Sie müssen sorgfältig abwägen, ob Ihr neues Feature genügend Speicherplatz bietet, um die Kosten für eine größere Bibliothek auszugleichen. Zum Entfernen aller Instanzen eines Elements können Sie List.filter mit einem negierten Prädikat verwenden. Die Designer könnten eine List.remove Funktion enthalten, die die Negation intern durchführt. Es ist nicht etwas Undenkbares, in der Tat neigen Lisps dazu, sowohl filter als auch remove zu haben. In Haskell und OCaml haben Sie allerdings nur filter - und wahrscheinlich sind F # -Designer hier gefolgt.

Wenn Sie nur eine einzelne Instanz eines Elements entfernen möchten, müssen Sie selbst etwas schreiben. Dies ist ein nicht standardmäßiger Anwendungsfall für eine Liste - Listen sind "über" akkumulierende Elemente in Folge; Das Entfernen bestimmter Elemente aus der Mitte der Liste (im Gegensatz zum Entfernen des Kopfes oder Entfernen aller unerwünschten Elemente) ist selten nützlich. Wenn Sie Elemente hinzufügen oder entfernen möchten, ohne die Reihenfolge beizubehalten, sind Sätze oder Karten (die als Multisets verwendet werden) besser für den Job geeignet.

6

Wenn Sie meinen, eine neue Liste mit einigen Einzelteilen, basierend auf ihren Wert entfernt zu schaffen, dann können Sie dies tun:

[1; 2; 3; 1] |> List.filter ((<>) 1) 

// Returns [2; 3] 

Dies verwendet die <> (nicht gleich) Operator in Präfix-Modus, indem sie in Klammern Einwickeln und dann currying es, indem es nur das erste Argument zur Verfügung stellt.

Beachten Sie, dass alle Instanzen dieses Werts ausgeschlossen sind.

1

Ich bin mir nicht sicher, warum Sie das erwarten würden. Zum Beispiel ist die gleiche Funktionalität (AFAIK) für Arrays in C# nicht verfügbar.

Allerdings, wenn Sie möchten, dass Sie die generische Liste verwenden können:

open System.Collections.Generic 

let xs = [1..3] 
let xs' = List(xs) 
xs'.Remove(2) 
xs' 
//val it : List<int> = seq [1; 3] 

Die allgemeine Liste hat .Remove, .RemoveAt und .RemoveAll Methoden.

Verwandte Themen