Controlla se un elenco e un array sono uguali F #
Sto cercando di confrontare un elenco e un array e vedere se sono uguali. Diciamo di avere una lista list = [1;2;3;4]
e un array ar = [|1;2;3;4|]
. La funzione dovrebbe restituire true
se uguale e false
se non uguale. L'ho fatto così:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
let list' = Array.toList ar
(list = list')
Quindi, in pratica, quello che sto facendo è semplicemente convertire e confrontare due elenchi. La mia domanda è: esiste un altro modo per farlo, intendo che non si limita a convertire tra elenco e array e che non si basa interamente sulle funzioni di libreria.
Risposte
Puoi sfruttare il fatto che sia gli elenchi che gli array (così come la maggior parte delle altre raccolte) implementano l' seq<'a>
interfaccia ( IEnumerable<T>
nei termini .NET) e quindi puoi semplicemente passarli alle funzioni dal Seq
modulo senza alcuna conversione. Si tratta solo di utilizzare un'interfaccia, quindi non c'è sovraccarico.
La funzione più semplice a cui riesco a pensare per verificare se due sequenze sono uguali è forall2
, che accetta due sequenze e controlla che un predicato valga per gli elementi a coppie. In questo caso, il predicato è solo un test di uguaglianza (fun a b -> a = b)
che puoi abbreviare come (=)
:
let list = [1;2;3;4]
let ar = [|1;2;3;4|]
Seq.forall2 (=) list ar
Ci sono molti modi per farlo. Eccone uno che confronta gli elementi a coppie:
if list.Length = ar.Length then
Seq.zip list ar
|> Seq.forall (fun (a, b) -> a = b)
else false
I documenti F # dicono:
Si confrontano due sequenze utilizzando la funzione Seq.compareWith. La funzione confronta gli elementi successivi a turno e si interrompe quando incontra la prima coppia disuguale. Eventuali elementi aggiuntivi non contribuiscono al confronto.
Che nel tuo caso diventa oneliner:
0 = Seq.compareWith (Comparer<_>.Default) list ar
Non ho controllato se si compila. Utilizzare Comparer.Default per confrontare le primitive, altrimenti, per i tipi personalizzati complessi, potrebbe essere necessario fornire le proprie.
Con Linq;
Enumerable.SequenceEqual (list, ar)
Sulla base di questo
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a