Verifique se uma lista e uma matriz são iguais a F #
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 true
se igual e false
se 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
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 Seq
mó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
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
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.
Com Linq;
Enumerable.SequenceEqual (list, ar)
Com base nisso
let l = [1;2;3;4]
let a = [|1;2;3;4|]
let result = Seq.compareWith Operators.compare l a