Sprawdź, czy lista i tablica są równe F #

Jan 20 2021

Próbuję porównać listę i tablicę i sprawdzić, czy są równe. Powiedzmy, że mamy listę list = [1;2;3;4]i tablicę ar = [|1;2;3;4|]. Funkcja powinna zwrócić, truejeśli jest równa i falsejeśli nie jest równa. Zrobiłem to tak:

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

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

Więc zasadniczo to, co robię, to po prostu konwertowanie i porównywanie dwóch list. Moje pytanie brzmi, czy istnieje inny sposób, aby to zrobić, mam na myśli, który nie polega po prostu na konwersji między listą a tablicą i który nie polega całkowicie na funkcjach bibliotecznych.

Odpowiedzi

4 TomasPetricek Jan 20 2021 at 19:09

Można wykorzystać fakt, że zarówno listy, jak i tablice (a także większość innych kolekcji) implementują seq<'a>interfejs ( IEnumerable<T>w kategoriach .NET) i można je po prostu przekazać do funkcji z Seqmodułu bez żadnych konwersji. To tylko użycie interfejsu, więc nie ma narzutów.

Najłatwiejszą funkcją, jaką przychodzi mi do głowy, do sprawdzania, czy dwie sekwencje są takie same, jest forall2pobieranie dwóch sekwencji i sprawdzanie, czy predykat zachowuje pary elementów. W tym przypadku predykat jest po prostu testem równości, (fun a b -> a = b)który można skrócić jako (=):

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

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

Można to zrobić na wiele sposobów. Oto przykład, który porównuje elementy parami:

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

Dokumenty F # mówią:

Porównujesz dwie sekwencje za pomocą funkcji Seq.compareWith. Funkcja porównuje kolejno kolejne elementy i zatrzymuje się, gdy napotka pierwszą nierówną parę. Żadne dodatkowe elementy nie mają wpływu na porównanie.

Który w Twoim przypadku staje się onelinerem:

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

Nie sprawdziłem, czy się kompiluje. Użyj Comparer.Default, aby porównać prymitywy, w przeciwnym razie w przypadku złożonych typów niestandardowych może być konieczne podanie własnych.

2 sardok Jan 20 2021 at 19:12

Z Linq;

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

Na tej podstawie

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