F # 10: Daftar

Pemrograman serius apa pun dalam bahasa apa pun akan selalu menyertakan daftar. Dengan demikian, Anda akan senang mengetahui bahwa F # sangat, sangat baik mendukung daftar menggunakan modul Daftarnya. Daftar dalam F # adalah serangkaian elemen yang dipesan dan tidak berubah dari jenis yang sama.

Buat daftar


Ada beberapa cara dalam F # yang dapat Anda buat daftar.

  • Buat daftar kosong
  • Buat daftar sederhana dengan item dari 1 hingga 10
  • Buat daftar dengan angka ganjil dalam kisaran 1 hingga 10
  • Gunakan for loop untuk membuat daftar.

let prettyPrint desc list = printfn desc printfn "%A" list //empty list let listEmpty = [] //simple list let list1 = [1 .. 10 ] //simple list, with step value let list2 = [1 ..2..10 ] //using for loops to create lists let list3 = [for i in 1 .. 10 -> i*2 ] prettyPrint "let listEmpty = []" listEmpty prettyPrint "let list1 = [ 1 .. 10 ]" list1 prettyPrint "let list2 = [ 1 .. 2..10 ]" list2 prettyPrint "[ for i in 1 .. 10 -> i*2 ]" list3 

gambar

Contoh terakhir yang ditunjukkan di atas menunjukkan bagaimana menggunakan loop for untuk membuat daftar, yang sangat keren, tetapi ada sesuatu yang lebih keren dan lebih kuat di kotak peralatan F #, yaitu List Comprehensions.

List Comprehensions adalah metode yang ampuh yang memungkinkan Anda membuat daftar menggunakan cukup banyak standar F #, yang mencakup fungsi / loop / kondisi, dll.

Mari kita terus melihat contoh bagaimana kita bisa membuat daftar.

 let is2 x = match x with | 2 -> "YES" | _ -> "NO" //yield directly let list1 = [ yield 1; yield 2; yield 3; ] //yield numbers between 1 and 20 where we use the //Math.Pow function to return a new number let list2 = [for i in 1.0 .. 20.0 do yield Math.Pow(i,2.0) ] //yield only numbers between 1 and 20 that //can be divided by 5 let list3 = [ for i in 1 .. 20 do if i % 5 = 0 then yield i ] //yields YES/NO strings depending on //whether source int = 2 or not let list4 = [for i in 1 .. 5 -> is2 i ] 

gambar

Beberapa operator daftar yang berguna


Operator kontra


Kita dapat menggunakan operator kontra โ€œ::โ€ untuk menambahkan nilai ke daftar yang ada, jadi anggaplah kita memiliki daftar ini:

 let list1 = [1;2;3;4] let list2 = 42 :: list1 

gambar

Operator gabungan


Operator lain yang sangat berguna adalah operator "@", yang memungkinkan Anda untuk menggabungkan daftar dengan tipe yang sama. Jadi, misalnya, jika kita memiliki ini:

 let list1 = [1;2;3;4] let list2 = [5;6;7;8] let list3 = list1 @ list2 

gambar

Daftar Modul


Saya tidak berpikir saya berlebihan ketika saya mengatakan bahwa modul Daftar adalah modul kunci dalam F #. Bahkan, dokumentasi MSDN untuk itu sangat bagus dibandingkan dengan yang lain di F #. Oleh karena itu, saya rasa saya tidak bisa menambahkan banyak kegunaan untuk contoh-contoh yang ditemukan di MSDN, tetapi saya akan memberikan beberapa di sini untuk kenyamanan Anda, tetapi Anda harus mempelajari MSDN untuk informasi lebih lanjut .

Sifat-sifat


Head
'T
Elemen pertama
Empty
'T list
Mengembalikan daftar kosong dari jenis yang ditentukan
Isempty
bool
true - jika tidak ada elemen dalam daftar
Barang
'T
Item yang ada di indeks tertentu
Panjangnya
int
Jumlah item
Buntut
Daftar
Daftar tanpa item pertama:

 let list1 = [ 1; 2; 3 ] // Properties printfn "list1.IsEmpty is %b" (list1.IsEmpty) printfn "list1.Length is %d" (list1.Length) printfn "list1.Head is %d" (list1.Head) printfn "list1.Tail.Head is %d" (list1.Tail.Head) printfn "list1.Tail.Tail.Head is %d" (list1.Tail.Tail.Head) printfn "list1.Item(1) is %d" (list1.Item(1)) 

gambar

Saring


Mengembalikan koleksi baru yang hanya berisi elemen-elemen koleksi yang predikat yang diberikan mengembalikan benar. Ini adalah contoh sepele yang hanya memilih angka genap dari daftar untuk membuat daftar baru

 let evenOnlyList = List.filter (fun x -> x % 2 = 0) [1; 2; 3; 4; 5; 6] 

gambar

Cari (temukan)


Mengembalikan elemen pertama yang mengembalikan fungsi ini benar. Dalam contoh ini, karena daftar dari 1 hingga 100 berisi 5, 5 adalah angka 1, yang dibagi dengan 5, jadi ini adalah nilai balik:

gambar

Untuk semua (semuanya)


Cek apakah semua elemen dalam koleksi memenuhi predikat yang diberikan. Dalam contoh ini, seluruh daftar harus berisi 0 untuk mendapatkan nilai balik yang benar.

 let isAllZeroes list = List.forall (fun elem -> elem = 0.0) list printfn "%b" (isAllZeroes [0.0; 0.0]) printfn "%b" (isAllZeroes [0.0; 1.0]) 

gambar

Berlaku untuk semua (Iteri)


Terapkan fungsi ini ke setiap item dalam koleksi. Bilangan bulat yang dilewatkan ke fungsi menunjukkan indeks elemen.

 let data = ["Cats";"Dogs";"Mice";"Elephants"] data |> List.iteri (fun ix -> printfn "item %d: %s" ix) 

gambar

Urutkan berdasarkan (Urutkan dengan)


Urutkan daftar yang ditentukan menggunakan fungsi perbandingan ini.

 let list1 = [ ""; "&"; "&&"; "&&&"; ""; "|"; "||"; "|||" ] printfn "Before sorting: " list1 |> printfn "%A" //custom sorting function let sortFunction (string1:string) (string2:string) = if (string1.Length > string2.Length) then 1 else if (string1.Length printfn "After sorting:\n%A" 

gambar

Ada banyak fungsi yang berguna dalam modul daftar, ini hanya sebagian kecil dari apa yang dapat Anda temukan.

Sekilas tentang rekursi atas daftar


Tidak ada pembahasan daftar yang akan lengkap tanpa membicarakan rekursi. Rekursi adalah tujuan dari keseluruhan postingan ini, tetapi untuk sekarang, mari kita lihat apa yang diperlukan untuk menulis fungsi rekursif yang bekerja pada daftar di F #.

 let printIt desc x = printfn "%A %A" desc x let rec printList list = match list with | h :: t -> printIt "head=" h printIt "tail=" t printList t | [] -> () printList [1;2;3;4;5] 

Perhatikan penggunaan kata kunci rec , yang memberi tahu kompiler F # bahwa fungsi ini akan bersifat rekursif. Tanpa kata kunci ini, panggilan fungsi rekursif - Anda akan menerima pesan kesalahan kompilasi, meskipun dengan teks kesalahan yang tidak terlalu jelas.

gambar

Jadi, mari kita lihat hasil contoh yang ditunjukkan sedikit lebih tinggi dengan daftar berikut [1; 2; 3; 4; 5]

gambar

Anda dapat melihat bahwa semuanya berfungsi dengan baik, dan berhenti berfungsi saat nilainya sesuai dengan daftar kosong, seperti yang diharapkan.

Source: https://habr.com/ru/post/id471998/


All Articles