Überprüfen Sie, ob eine Liste und ein Array gleich F # sind

Jan 20 2021

Ich versuche, eine Liste und ein Array zu vergleichen und festzustellen, ob sie gleich sind. Nehmen wir an, wir haben eine Liste list = [1;2;3;4]und ein Array ar = [|1;2;3;4|]. Die Funktion sollte zurückgegeben werden, truewenn sie gleich und falsewenn nicht gleich ist. Ich habe es so gemacht:

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

let list' = Array.toList ar
(list = list')

Im Grunde genommen konvertiere und vergleiche ich einfach zwei Listen. Meine Frage ist, ob es einen anderen Weg gibt, dies zu tun. Ich meine, die nicht einfach zwischen Liste und Array konvertieren und sich nicht vollständig auf Bibliotheksfunktionen stützen.

Antworten

4 TomasPetricek Jan 20 2021 at 19:09

Sie können die Tatsache nutzen, dass sowohl Listen als auch Arrays (sowie die meisten anderen Sammlungen) die seq<'a>Schnittstelle implementieren ( IEnumerable<T>in den .NET-Begriffen), und sie einfach Seqohne Konvertierungen an die Funktionen des Moduls übergeben. Hierbei wird nur eine Schnittstelle verwendet, sodass kein Overhead entsteht.

Die einfachste Funktion, die ich mir vorstellen kann, um zu überprüfen, ob zwei Sequenzen gleich sind forall2, ist die , die zwei Sequenzen verwendet und prüft, ob ein Prädikat für die Elemente paarweise gilt. In diesem Fall ist das Prädikat nur ein Gleichheitstest, (fun a b -> a = b)den Sie abkürzen können als (=):

let list = [1;2;3;4]
let ar = [|1;2;3;4|]

Seq.forall2 (=) list ar
2 brianberns Jan 20 2021 at 10:37

Es gibt viele Möglichkeiten, dies zu tun. Hier ist eine, die die Elemente paarweise vergleicht:

if list.Length = ar.Length then
    Seq.zip list ar
        |> Seq.forall (fun (a, b) -> a = b)
else false
2 SerejaBogolubov Jan 20 2021 at 15:01

F # -Dokumente sagen:

Sie vergleichen zwei Sequenzen mit der Funktion Seq.compareWith. Die Funktion vergleicht nacheinander aufeinanderfolgende Elemente und stoppt, wenn sie auf das erste ungleiche Paar trifft. Zusätzliche Elemente tragen nicht zum Vergleich bei.

Was in Ihrem Fall zum Oneliner wird:

0 = Seq.compareWith (Comparer<_>.Default) list ar

Ich habe nicht überprüft, ob es kompiliert wird. Verwenden Sie Comparer.Default , um Grundelemente zu vergleichen. Andernfalls müssen Sie für komplexe benutzerdefinierte Typen möglicherweise Ihre eigenen bereitstellen.

2 sardok Jan 20 2021 at 19:12

Mit Linq;

Enumerable.SequenceEqual (list, ar)
2 ThanasisK Jan 20 2021 at 19:24

Basierend darauf

let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a