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

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

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

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

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
Isemptybooltrue - jika tidak ada elemen dalam daftar
Barang'T
Item yang ada di indeks tertentu
PanjangnyaintJumlah item
BuntutDaftar
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))

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

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:

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])

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)

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"

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.

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

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