Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Anotasi jenis fleksibel menunjukkan bahwa parameter, variabel, atau nilai memiliki jenis yang kompatibel dengan jenis tertentu, di mana kompatibilitas ditentukan oleh posisi dalam hierarki kelas atau antarmuka yang berorientasi objek. Jenis fleksibel berguna secara khusus ketika konversi otomatis ke jenis yang lebih tinggi dalam hierarki jenis tidak terjadi tetapi Anda masih ingin mengaktifkan fungsionalitas Anda untuk bekerja dengan jenis apa pun dalam hierarki atau jenis apa pun yang mengimplementasikan antarmuka.
Sintaksis
#type
Komentar
Dalam sintaks sebelumnya, jenis mewakili jenis dasar atau antarmuka.
Jenis fleksibel setara dengan jenis generik yang memiliki batasan yang membatasi jenis yang diizinkan ke jenis yang kompatibel dengan jenis dasar atau antarmuka. Artinya, dua baris kode berikut setara.
#SomeType
'T when 'T :> SomeType
Jenis fleksibel berguna dalam beberapa jenis situasi. Misalnya, ketika Anda memiliki fungsi urutan yang lebih tinggi (fungsi yang mengambil fungsi sebagai argumen), sering kali berguna untuk meminta fungsi mengembalikan jenis fleksibel. Dalam contoh berikut, penggunaan jenis fleksibel dengan argumen urutan memungkinkan iterate2 fungsi urutan yang lebih tinggi untuk bekerja dengan fungsi yang menghasilkan urutan, array, daftar, dan jenis enumerable lainnya.
Pertimbangkan dua fungsi berikut, salah satunya mengembalikan urutan, yang lainnya mengembalikan jenis fleksibel.
let iterate1 (f : unit -> seq<int>) =
for e in f() do printfn "%d" e
let iterate2 (f : unit -> #seq<int>) =
for e in f() do printfn "%d" e
// Passing a function that takes a list requires a cast.
iterate1 (fun () -> [1] :> seq<int>)
// Passing a function that takes a list to the version that specifies a
// flexible type as the return value is OK as is.
iterate2 (fun () -> [1])
Sebagai contoh lain, pertimbangkan fungsi pustaka Seq.concat :
val concat: sequences:seq<#seq<'T>> -> seq<'T>
Anda dapat meneruskan salah satu urutan yang dapat dijumlahkan berikut ke fungsi ini:
- Daftar daftar
- Daftar array
- Array daftar
- Array urutan
- Kombinasi lain dari urutan yang dapat dijumlahkan
Kode berikut menggunakan Seq.concat untuk menunjukkan skenario yang dapat Anda dukung dengan menggunakan jenis fleksibel.
let list1 = [1;2;3]
let list2 = [4;5;6]
let list3 = [7;8;9]
let concat1 = Seq.concat [ list1; list2; list3]
printfn "%A" concat1
let array1 = [|1;2;3|]
let array2 = [|4;5;6|]
let array3 = [|7;8;9|]
let concat2 = Seq.concat [ array1; array2; array3 ]
printfn "%A" concat2
let concat3 = Seq.concat [| list1; list2; list3 |]
printfn "%A" concat3
let concat4 = Seq.concat [| array1; array2; array3 |]
printfn "%A" concat4
let seq1 = { 1 .. 3 }
let seq2 = { 4 .. 6 }
let seq3 = { 7 .. 9 }
let concat5 = Seq.concat [| seq1; seq2; seq3 |]
printfn "%A" concat5
Outputnya sebagai berikut.
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
seq [1; 2; 3; 4; ...]
Dalam F#, seperti dalam bahasa berorientasi objek lainnya, ada konteks di mana jenis turunan atau jenis yang mengimplementasikan antarmuka secara otomatis dikonversi ke jenis dasar atau jenis antarmuka. Konversi otomatis ini terjadi dalam argumen langsung, tetapi tidak ketika jenis berada dalam posisi subordinat, sebagai bagian dari jenis yang lebih kompleks seperti jenis pengembalian jenis fungsi, atau sebagai argumen jenis. Dengan demikian, notasi jenis fleksibel terutama berguna ketika jenis yang Anda terapkan adalah bagian dari jenis yang lebih kompleks.