Compruebe si una lista y una matriz son iguales F #

Jan 20 2021

Estoy tratando de comparar una lista y una matriz y ver si son iguales. Digamos que tenemos una lista list = [1;2;3;4]y una matriz ar = [|1;2;3;4|]. La función debe regresar truesi es igual y falsesi no es igual. Lo hice así:

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

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

Básicamente, lo que estoy haciendo es simplemente convertir y comparar dos listas. Mi pregunta es si hay alguna otra forma de hacer esto, quiero decir que no se limite a convertir entre lista y matriz y que no dependa completamente de las funciones de la biblioteca.

Respuestas

4 TomasPetricek Jan 20 2021 at 19:09

Puede usar el hecho de que tanto las listas como las matrices (así como la mayoría de las otras colecciones) implementan la seq<'a>interfaz ( IEnumerable<T>en términos de .NET) y, por lo tanto, puede pasarlas a las funciones del Seqmódulo sin ninguna conversión. Esto solo usa una interfaz, por lo que no hay gastos generales.

La función más fácil en la que puedo pensar para verificar si dos secuencias son iguales es forall2, que toma dos secuencias y verifica que un predicado sea válido para los elementos por pares. En este caso, el predicado es solo una prueba de igualdad (fun a b -> a = b)que puede resumir como (=):

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

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

Hay muchas formas de hacer esto. Aquí hay uno que compara los elementos por parejas:

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 # docs dicen:

Compara dos secuencias usando la función Seq.compareWith. La función compara elementos sucesivos a su vez y se detiene cuando encuentra el primer par desigual. Cualquier elemento adicional no contribuye a la comparación.

Que en tu caso se convierte en un delineador:

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

No comprobé si se compila. Utilice Comparer.Default para comparar primitivas; de lo contrario, para tipos personalizados complejos, es posible que deba proporcionar los suyos propios.

2 sardok Jan 20 2021 at 19:12

Con Linq;

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

Basado en esto

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