Verifique se uma lista e uma matriz são iguais a F #

Jan 20 2021

Estou tentando comparar uma lista e uma matriz e ver se eles são iguais. Digamos que temos uma lista list = [1;2;3;4]e um array ar = [|1;2;3;4|]. A função deve retornar truese igual e falsese não for igual. Eu fiz assim:

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

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

Então, basicamente, o que estou fazendo é simplesmente converter e comparar duas listas. Minha pergunta é se existe alguma outra maneira de fazer isso, quero dizer, qual não é simplesmente converter entre lista e array e que não depende inteiramente de funções de biblioteca.

Respostas

4 TomasPetricek Jan 20 2021 at 19:09

Você pode usar o fato de que as listas e os arrays (bem como a maioria das outras coleções) implementam a seq<'a>interface ( IEnumerable<T>nos termos do .NET) e, portanto, você pode simplesmente passá-los para as funções do Seqmódulo sem nenhuma conversão. Isso é apenas usando uma interface, portanto, não há sobrecarga.

A função mais fácil que consigo pensar para verificar se duas sequências são iguais é forall2, que pega duas sequências e verifica se um predicado é válido para os elementos aos pares. Nesse caso, o predicado é apenas um teste de igualdade (fun a b -> a = b)que você pode ignorar 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

Existem muitas maneiras de fazer isso. Aqui está um que compara os elementos aos pares:

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

Os documentos F # dizem:

Você compara duas sequências usando a função Seq.compareWith. A função compara elementos sucessivos por sua vez e para quando encontra o primeiro par desigual. Quaisquer elementos adicionais não contribuem para a comparação.

Que no seu caso se torna uma linha:

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

Não verifiquei se ele compila. Use o Comparer.Default para comparar primitivas; caso contrário, para tipos personalizados complexos, você pode precisar fornecer seus próprios.

2 sardok Jan 20 2021 at 19:12

Com Linq;

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

Com base nisso

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