Periksa apakah daftar dan array sama dengan F #

Jan 20 2021

Saya mencoba membandingkan daftar dan array dan melihat apakah mereka sama. Katakanlah kita memiliki daftar list = [1;2;3;4]dan array ar = [|1;2;3;4|]. Fungsi tersebut harus dikembalikan truejika sama dan falsejika tidak sama. Saya melakukannya seperti ini:

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

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

Jadi pada dasarnya apa yang saya lakukan hanyalah mengkonversi dan membandingkan dua daftar .. Pertanyaan saya adalah apakah ada cara lain untuk melakukan ini, maksud saya yang tidak hanya mengkonversi antara daftar dan array dan yang tidak bergantung sepenuhnya pada fungsi perpustakaan.

Jawaban

4 TomasPetricek Jan 20 2021 at 19:09

Anda dapat menggunakan fakta bahwa daftar dan larik (serta sebagian besar koleksi lainnya) mengimplementasikan seq<'a>antarmuka ( IEnumerable<T>dalam istilah .NET) sehingga Anda dapat meneruskannya ke fungsi dari Seqmodul tanpa konversi apa pun. Ini hanya menggunakan antarmuka, jadi tidak ada biaya tambahan.

Fungsi termudah yang dapat saya pikirkan untuk memeriksa apakah dua urutan itu sama adalah forall2, yang mengambil dua urutan dan memeriksa bahwa predikat berlaku untuk elemen secara berpasangan. Dalam hal ini, predikatnya hanyalah uji kesetaraan (fun a b -> a = b)yang dapat disimpulkan sebagai (=):

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

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

Ada banyak cara untuk melakukan ini. Inilah salah satu yang membandingkan elemen secara berpasangan:

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 # dokumen mengatakan:

Anda membandingkan dua urutan dengan menggunakan fungsi Seq.compareWith. Fungsi tersebut membandingkan elemen yang berurutan secara bergantian, dan berhenti jika menemukan pasangan pertama yang tidak sama. Elemen tambahan apa pun tidak berkontribusi pada perbandingan.

Yang dalam kasus Anda menjadi satu perjalanan:

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

Tidak memeriksa apakah itu dikompilasi. Gunakan Comparer.Default untuk membandingkan primitif, jika tidak, untuk jenis kustom yang rumit Anda mungkin perlu menyediakan milik Anda sendiri.

2 sardok Jan 20 2021 at 19:12

Dengan Linq;

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

Berdasarkan ini

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