F # - Daftar

Dalam F #, list adalah rangkaian elemen yang teratur dan tidak dapat diubah dari tipe yang sama. Ini sampai batas tertentu setara dengan struktur data daftar tertaut.

Modul F #, Microsoft.FSharp.Collections.List,memiliki operasi umum pada daftar. Namun F # mengimpor modul ini secara otomatis dan membuatnya dapat diakses oleh setiap aplikasi F #.

Membuat dan Memulai Daftar

Berikut adalah berbagai cara membuat daftar -

  • Menggunakan daftar literals.

  • Menggunakan cons (: :) operator.

  • Menggunakan List.init metode modul Daftar.

  • Menggunakan beberapa syntactic constructs dipanggil List Comprehensions.

Daftar Literal

Dalam metode ini, Anda cukup menentukan urutan nilai yang dipisahkan titik koma dalam tanda kurung siku. Misalnya -

let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]

Kontra (: :) Operator

Dengan metode ini, Anda dapat menambahkan beberapa nilai dengan prepending atau cons-ingitu ke daftar yang ada menggunakan :: operator. Misalnya -

let list2 = 1::2::3::4::5::6::7::8::9::10::[];;

[] menunjukkan daftar kosong.

Daftar Metode init

Metode List.init dari modul List sering digunakan untuk membuat daftar. Metode ini memiliki tipe -

val init : int -> (int -> 'T) -> 'T list

Argumen pertama adalah panjang daftar baru yang diinginkan, dan argumen kedua adalah fungsi penginisialisasi, yang menghasilkan item dalam daftar.

Sebagai contoh,

let list5 = List.init 5 (fun index -> (index, index * index, index * index * index))

Di sini, fungsi indeks menghasilkan daftar.

Daftar Pemahaman

Pemahaman daftar adalah konstruksi sintaksis khusus yang digunakan untuk menghasilkan daftar.

Sintaks pemahaman daftar F # hadir dalam dua bentuk - rentang dan generator.

Rentang memiliki konstruksi - [start .. end] dan [start .. step .. end]

Sebagai contoh,

let list3 = [1 .. 10]

Generator memiliki konstruksi - [untuk x dalam koleksi do ... yield expr]

Sebagai contoh,

let list6 = [ for a in 1 .. 10 do yield (a * a) ]

Sebagai yield kata kunci mendorong satu nilai ke dalam daftar, kata kunci, yield!, mendorong kumpulan nilai ke dalam daftar.

Fungsi berikut menunjukkan metode di atas -

Contoh

(* using list literals *)
let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
printfn "The list: %A" list1

(*using cons operator *)
let list2 = 1 :: 2 :: 3 :: []
printfn "The list: %A" list2

(* using range constructs*)
let list3 = [1 .. 10]
printfn "The list: %A" list3

(* using range constructs *)
let list4 = ['a' .. 'm']
printfn "The list: %A" list4

(* using init method *)
let list5 = List.init 5 (fun index -> (index, index * index, index * index * index))
printfn "The list: %A" list5

(* using yield operator *)
let list6 = [ for a in 1 .. 10 do yield (a * a) ]
printfn "The list: %A" list6

(* using yield operator *)
let list7 = [ for a in 1 .. 100 do if a % 3 = 0 && a % 5 = 0 then yield a]
printfn "The list: %A" list7

(* using yield! operator *)
let list8 = [for a in 1 .. 3 do yield! [ a .. a + 3 ] ]
printfn "The list: %A" list8

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
The list: [1; 2; 3]
The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
The list: ['a'; 'b'; 'c'; 'd'; 'e'; 'f'; 'g'; 'h'; 'i'; 'j'; 'k'; 'l'; 'm']
The list: [(0, 0, 0); (1, 1, 1); (2, 4, 8); (3, 9, 27); (4, 16, 64)]
The list: [1; 4; 9; 16; 25; 36; 49; 64; 81; 100]
The list: [15; 30; 45; 60; 75; 90]
The list: [1; 2; 3; 4; 2; 3; 4; 5; 3; 4; 5; 6]

Properti Tipe Data Daftar

Tabel berikut memperlihatkan berbagai properti tipe data daftar -

Properti Tipe Deskripsi
Kepala 'T Elemen pertama.
Kosong Daftar T Properti statis yang mengembalikan daftar kosong dari tipe yang sesuai.
Kosong bool true jika daftar tidak memiliki elemen.
Barang 'T Elemen pada indeks yang ditentukan (berbasis nol).
Panjangnya int Jumlah elemen.
Ekor Daftar T Daftar tanpa elemen pertama.

Contoh berikut menunjukkan penggunaan properti ini -

Contoh

let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ]

// Use of 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))

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

list1.IsEmpty is false
list1.Length is 8
list1.Head is 2
list1.Tail.Head is 4
list1.Tail.Tail.Head is 6
list1.Item(1) is 4

Operator Dasar dalam Daftar

Tabel berikut menunjukkan operasi dasar pada tipe data daftar -

Nilai Deskripsi
tambahkan: 'Daftar T →' Daftar T → 'Daftar T Mengembalikan daftar baru yang berisi elemen dari daftar pertama diikuti dengan elemen dari daftar kedua.
rata-rata: 'Daftar T → ^ T Mengembalikan rata-rata elemen dalam daftar.
averageBy: ('T → ^ U) →' T list → ^ U Mengembalikan rata-rata elemen yang dihasilkan dengan menerapkan fungsi ke setiap elemen daftar.
pilih: ('T →' U option) → 'T list →' U list Menerapkan fungsi yang diberikan ke setiap elemen daftar. Mengembalikan daftar yang terdiri dari hasil untuk setiap elemen tempat fungsi kembaliSome.
kumpulkan: ('T →' daftar U) → 'Daftar T →' Daftar U. Untuk setiap elemen daftar, terapkan fungsi yang diberikan. Menggabungkan semua hasil dan mengembalikan daftar gabungan.
concat: seq <'T list> →' T list Mengembalikan daftar baru yang berisi elemen dari setiap daftar secara berurutan.
kosong: 'T list Menampilkan daftar kosong dari tipe yang diberikan.
ada: ('T → bool) →' T list → bool Menguji apakah ada elemen dalam daftar yang memenuhi predikat yang diberikan.
existing2: ('T1 →' T2 → bool) → 'T1 list →' T2 list → bool Menguji apakah ada pasangan elemen yang sesuai dari daftar yang memenuhi predikat yang diberikan.
filter: ('T → bool) →' T list → 'T list Mengembalikan koleksi baru yang hanya berisi elemen koleksi yang predikatnya dikembalikan true.
temukan: ('T → bool) →' T list → 'T Mengembalikan elemen pertama yang dikembalikan fungsi yang diberikan true.
findIndex: ('T → bool) →' T list → int Mengembalikan indeks elemen pertama dalam daftar yang memenuhi predikat yang diberikan.
fold: ('State →' T → 'State) →' State → 'T list →' State Menerapkan fungsi ke setiap elemen koleksi, memasukkan argumen akumulator melalui komputasi. Fungsi ini mengambil argumen kedua, dan menerapkan fungsi ke argumen tersebut dan elemen pertama dari daftar. Kemudian, ia meneruskan hasil ini ke dalam fungsi bersama dengan elemen kedua, dan seterusnya. Akhirnya, ini mengembalikan hasil akhir. Jika fungsi masukan adalah f dan elemennya adalah i0 ... iN, maka fungsi ini menghitung f (... (fs i0) i1 ...) iN.
fold2: ('State →' T1 → 'T2 →' State) → 'State →' T1 list → 'T2 list →' State Menerapkan fungsi ke elemen yang sesuai dari dua koleksi, memasukkan argumen akumulator melalui komputasi. Koleksi harus memiliki ukuran yang identik. Jika fungsi input adalah f dan elemennya adalah i0 ... iN dan j0 ... jN, maka fungsi ini menghitung f (... (fs i0 j0) ...) iN jN.
foldBack: ('T →' State → 'State) →' T list → 'State →' State Menerapkan fungsi ke setiap elemen koleksi, memasukkan argumen akumulator melalui komputasi. Jika fungsi input isf dan elemennya adalah i0 ... iN maka hitung f i0 (... (f iN s)).
foldBack2: ('T1 →' T2 → 'State →' State) → 'T1 list →' T2 list → 'State →' State Menerapkan fungsi ke elemen yang sesuai dari dua koleksi, memasukkan argumen akumulator melalui komputasi. Koleksi harus memiliki ukuran yang identik. Jika fungsi inputnya adalah f dan elemennya adalah i0 ... iN dan j0 ... jN, maka fungsi ini menghitung f i0 j0 (... (f iN jN s)).
forall: ('T → bool) →' T list → bool Menguji apakah semua elemen koleksi memenuhi predikat yang diberikan.
forall2: ('T1 →' T2 → bool) → 'T1 list →' T2 list → bool Menguji apakah semua elemen yang sesuai dari koleksi memenuhi predikat berpasangan.
kepala: 'Daftar T →' T Mengembalikan elemen pertama dari daftar.
init: int → (int → 'T) →' T daftar Membuat daftar dengan memanggil generator yang diberikan pada setiap indeks.
isEmpty: 'T list → bool Kembali true jika daftar tidak berisi elemen, false jika tidak.
iter: ('T → unit) →' T list → unit Menerapkan fungsi yang diberikan ke setiap elemen koleksi.
iter2: ('T1 →' T2 → unit) → 'T1 list →' T2 list → unit Menerapkan fungsi yang diberikan ke dua koleksi secara bersamaan. Koleksinya harus berukuran sama.
iteri: (int → 'T → unit) →' T list → unit Menerapkan fungsi yang diberikan ke setiap elemen koleksi. Integer yang diteruskan ke fungsi menunjukkan indeks elemen.
iteri2: (int → 'T1 →' T2 → unit) → 'T1 list →' T2 list → unit Menerapkan fungsi yang diberikan ke dua koleksi secara bersamaan. Koleksinya harus berukuran sama. Integer yang diteruskan ke fungsi menunjukkan indeks elemen.
panjang: 'T list → int Menampilkan panjang daftar.
peta: ('T →' U) → 'T list →' U list Membuat koleksi baru yang elemennya merupakan hasil penerapan fungsi yang diberikan ke setiap elemen koleksi.
map2: ('T1 →' T2 → 'U) →' T1 list → 'T2 list →' U list Membuat koleksi baru yang elemennya merupakan hasil penerapan fungsi yang diberikan ke elemen yang sesuai dari dua koleksi secara berpasangan.
map3: ('T1 →' T2 → 'T3 →' U) → 'T1 list →' T2 list → 'T3 list →' U list Membuat koleksi baru yang elemennya merupakan hasil penerapan fungsi yang diberikan ke elemen yang sesuai dari tiga koleksi secara bersamaan.
mapi: (int → 'T →' U) → 'T list →' U list Membuat koleksi baru yang elemennya merupakan hasil penerapan fungsi yang diberikan ke setiap elemen koleksi. Indeks integer yang diteruskan ke fungsi menunjukkan indeks (dari 0) elemen yang sedang diubah.
mapi2: (int → 'T1 →' T2 → 'U) →' T1 list → 'T2 list →' U list Seperti List.mapi, tetapi memetakan elemen yang sesuai dari dua daftar dengan panjang yang sama.
maks: 'Daftar T →' T Mengembalikan yang terbesar dari semua elemen daftar, dibandingkan dengan menggunakan Operators.max.
maxBy: ('T →' U) → 'T list →' T Mengembalikan yang terbesar dari semua elemen daftar, dibandingkan dengan menggunakan Operators.max pada hasil fungsi.
min: 'Daftar T →' T Mengembalikan nilai terendah dari semua elemen daftar, dibandingkan dengan menggunakan Operators.min.
minBy: ('T →' U) → 'T list →' T Mengembalikan nilai terendah dari semua elemen daftar, dibandingkan dengan menggunakan Operators.min pada hasil fungsi
nth: 'T list → int →' T Mengindeks ke dalam daftar. Elemen pertama memiliki indeks 0.
ofArray: 'T [] →' T daftar Membuat daftar dari larik yang diberikan.
ofSeq: seq <'T> →' T daftar Membuat daftar baru dari objek yang dapat dihitung.
partisi: ('T → bool) →' T list * 'T list Membagi koleksi menjadi dua koleksi, berisi elemen yang dikembalikan predikatnya true dan false masing-masing.
permute: (int → int) → 'T list →' T list Mengembalikan daftar dengan semua elemen yang diizinkan sesuai dengan permutasi yang ditentukan.
pilih: ('T →' opsi U) → 'Daftar T →' U Menerapkan fungsi yang diberikan ke elemen yang berurutan, mengembalikan hasil pertama di mana fungsi kembali Some untuk beberapa nilai.
mengurangi: ('T →' T → 'T) →' T list → 'T Menerapkan fungsi ke setiap elemen koleksi, memasukkan argumen akumulator melalui komputasi. Fungsi ini menerapkan fungsi yang ditentukan ke dua elemen pertama dari daftar. Ia kemudian meneruskan hasil ini ke dalam fungsi bersama dengan elemen ketiga, dan seterusnya. Akhirnya, ini mengembalikan hasil akhir. Jika fungsi inputnya adalah f dan elemennya adalah i0 ... iN, maka fungsi ini menghitung f (... (f i0 i1) i2 ...) iN.
reduceBack: ('T →' T → 'T) →' T list → 'T Menerapkan fungsi ke setiap elemen koleksi, memasukkan argumen akumulator melalui komputasi. Jika fungsi masukan isf dan elemennya adalah i0 ... iN, maka fungsi ini menghitung f i0 (... (f iN-1 iN)).
replikasi: (int → 'T →' T list) Membuat daftar dengan memanggil generator yang diberikan pada setiap indeks.
rev: 'Daftar T →' Daftar T. Mengembalikan daftar baru dengan elemen dalam urutan terbalik.
scan: ('State →' T → 'State) →' State → 'T list →' State list Menerapkan fungsi ke setiap elemen koleksi, memasukkan argumen akumulator melalui komputasi. Fungsi ini mengambil argumen kedua, dan menerapkan fungsi yang ditentukan padanya dan elemen pertama dari daftar. Kemudian, ia meneruskan hasil ini ke dalam fungsi bersama dengan elemen kedua dan seterusnya. Akhirnya, ini mengembalikan daftar hasil antara dan hasil akhir.
scanBack: ('T →' State → 'State) →' T list → 'State →' State list Seperti foldBack, tetapi mengembalikan hasil antara dan akhir
urutkan: 'Daftar T →' Daftar T. Mengurutkan daftar yang diberikan menggunakan Operators.compare.
sortBy: ('T →' Key) → 'T list →' T list Mengurutkan daftar yang diberikan menggunakan kunci yang diberikan oleh proyeksi yang diberikan. Kunci dibandingkan menggunakan Operators.compare.
sortWith: ('T →' T → int) → 'T list →' T list Mengurutkan daftar yang diberikan menggunakan fungsi perbandingan yang diberikan.
jumlah: ^ Daftar T → ^ T Mengembalikan jumlah elemen dalam daftar.
sumBy: ('T → ^ U) →' T list → ^ U Mengembalikan jumlah hasil yang dihasilkan dengan menerapkan fungsi ke setiap elemen daftar.
ekor: 'Daftar T →' Daftar T. Mengembalikan daftar input tanpa elemen pertama.
toArray: 'T list →' T [] Membuat array dari daftar yang diberikan.
toSeq: 'T list → seq <' T> Melihat daftar yang diberikan sebagai urutan.
tryFind: ('T → bool) →' T list → 'T pilihan Mengembalikan elemen pertama yang dikembalikan fungsi yang diberikan true. KembaliNone jika tidak ada elemen seperti itu.
tryFindIndex: ('T → bool) →' T list → opsi int Mengembalikan indeks elemen pertama dalam daftar yang memenuhi predikat yang diberikan. KembaliNone jika tidak ada elemen seperti itu.
tryPick: (opsi 'T →' U) → 'Daftar T →' Opsi U. Menerapkan fungsi yang diberikan ke elemen yang berurutan, mengembalikan hasil pertama di mana fungsi kembali Someuntuk beberapa nilai. Jika tidak ada elemen seperti itu, kembalikanNone.
unzip: ('T1 *' T2) list → 'T1 list *' T2 list Membagi daftar pasangan menjadi dua daftar.
unzip3: ('T1 *' T2 * 'T3) list →' T1 list * 'T2 list *' T3 list Membagi daftar tiga kali lipat menjadi tiga daftar.
zip: 'T1 list →' T2 list → ('T1 *' T2) list Menggabungkan dua daftar menjadi daftar pasangan. Kedua daftar harus memiliki panjang yang sama.
zip3: 'T1 list →' T2 list → 'T3 list → (' T1 * 'T2 *' T3) list Menggabungkan tiga daftar menjadi daftar tiga kali lipat. Daftar harus memiliki panjang yang sama.

Contoh berikut menunjukkan penggunaan fungsi di atas -

Contoh 1

Program ini menunjukkan pembalikan daftar secara rekursif -

let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ]
printfn "The original list: %A" list1

let reverse lt =
   let rec loop acc = function
      | [] -> acc
      | hd :: tl -> loop (hd :: acc) tl
   loop [] lt

printfn "The reversed list: %A" (reverse list1)

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The original list: [2; 4; 6; 8; 10; 12; 14; 16]
The reversed list: [16; 14; 12; 10; 8; 6; 4; 2]

Namun, Anda dapat menggunakan rev fungsi modul untuk tujuan yang sama -

let list1 = [ 2; 4; 6; 8; 10; 12; 14; 16 ]
printfn "The original list: %A" list1
printfn "The reversed list: %A" (List.rev list1)

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The original list: [2; 4; 6; 8; 10; 12; 14; 16]
The reversed list: [16; 14; 12; 10; 8; 6; 4; 2]

Contoh 2

Program ini menunjukkan pemfilteran daftar menggunakan List.filter metode -

let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
printfn "The list: %A" list1
let list2 = list1 |> List.filter (fun x -> x % 2 = 0);;
printfn "The Filtered list: %A" list2

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
The Filtered list: [2; 4; 6; 8; 10]

Contoh 3

Itu List.map metode memetakan daftar dari satu jenis ke jenis lainnya -

let list1 = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
printfn "The list: %A" list1
let list2 = list1 |> List.map (fun x -> (x * x).ToString());;
printfn "The Mapped list: %A" list2

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
The Mapped list: ["1"; "4"; "9"; "16"; "25"; "36"; "49"; "64"; "81"; "100"]

Contoh 4

Itu List.append metode dan operator @ menambahkan satu daftar ke daftar lainnya -

let list1 = [1; 2; 3; 4; 5 ]
let list2 = [6; 7; 8; 9; 10]
let list3 = List.append list1 list2

printfn "The first list: %A" list1
printfn "The second list: %A" list2
printfn "The appened list: %A" list3

let lt1 = ['a'; 'b';'c' ]
let lt2 = ['e'; 'f';'g' ]
let lt3 = lt1 @ lt2

printfn "The first list: %A" lt1
printfn "The second list: %A" lt2
printfn "The appened list: %A" lt3

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The first list: [1; 2; 3; 4; 5]
The second list: [6; 7; 8; 9; 10]
The appened list: [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
The first list: ['a'; 'b'; 'c']
The second list: ['e'; 'f'; 'g']
The appened list: ['a'; 'b'; 'c'; 'e'; 'f'; 'g']

Contoh 5

Itu List.sortmetode mengurutkan daftar. ItuList.sum metode memberikan jumlah elemen dalam daftar dan List.average metode memberikan rata-rata elemen dalam daftar -

let list1 = [9.0; 0.0; 2.0; -4.5; 11.2; 8.0; -10.0]
printfn "The list: %A" list1

let list2 = List.sort list1
printfn "The sorted list: %A" list2

let s = List.sum list1
let avg = List.average list1
printfn "The sum: %f" s
printfn "The average: %f" avg

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

The list: [9.0; 0.0; 2.0; -4.5; 11.2; 8.0; -10.0]
The sorted list: [-10.0; -4.5; 0.0; 2.0; 8.0; 9.0; 11.2]
The sum: 15.700000
The average: 2.242857

Operasi "lipat" menerapkan fungsi ke setiap elemen dalam daftar, menggabungkan hasil fungsi dalam variabel akumulator, dan mengembalikan akumulator sebagai hasil dari operasi lipatan.

Contoh 6

Itu List.fold metode menerapkan fungsi ke setiap elemen dari kiri ke kanan, sementara List.foldBack menerapkan fungsi ke setiap elemen dari kanan ke kiri.

let sumList list = List.fold (fun acc elem -> acc + elem) 0 list
printfn "Sum of the elements of list %A is %d." [ 1 .. 10 ] (sumList [ 1 .. 10 ])

Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -

Sum of the elements of list [1; 2; 3; 4; 5; 6; 7; 8; 9; 10] is 55.