Inferensi jenis
Topik ini menjelaskan bagaimana kompilator F# menyimpulkan jenis nilai, variabel, parameter, dan nilai kembali.
Inferensi Jenis secara Umum
Ide inferensi jenis adalah bahwa Anda tidak perlu menentukan jenis konstruksi F# kecuali ketika kompilator tidak dapat menyimpulkan jenis secara meyakinkan. Menghilangkan informasi jenis eksplisit tidak berarti bahwa F# adalah bahasa yang diketik secara dinamis atau nilai-nilai dalam F# diketik dengan lemah. F# adalah bahasa yang diketik secara statis, yang berarti bahwa kompilator menyimpulkan jenis yang tepat untuk setiap konstruksi selama kompilasi. Jika tidak ada informasi yang cukup bagi kompilator untuk menyimpulkan jenis setiap konstruksi, Anda harus memberikan informasi jenis tambahan, biasanya dengan menambahkan anotasi jenis eksplisit di suatu tempat dalam kode.
Inferensi Parameter dan Jenis Pengembalian
Dalam daftar parameter, Anda tidak perlu menentukan jenis setiap parameter. Namun, F# adalah bahasa yang diketik secara statis, dan oleh karena itu setiap nilai dan ekspresi memiliki jenis yang pasti pada waktu kompilasi. Untuk jenis yang tidak Anda tentukan secara eksplisit, kompilator menyimpulkan jenis berdasarkan konteksnya. Jika jenisnya tidak ditentukan lain, itu disimpulkan sebagai generik. Jika kode menggunakan nilai secara tidak konsisten, sedemikian rupa sehingga tidak ada satu jenis kesimpulan yang memenuhi semua penggunaan nilai, kompilator melaporkan kesalahan.
Jenis pengembalian suatu fungsi ditentukan oleh jenis ekspresi terakhir dalam fungsi tersebut.
Misalnya, dalam kode berikut, jenis parameter a
dan b
dan jenis yang dikembalikan semuanya disimpulkan sebagai int
karena harfiah 100
berjenis int
.
let f a b = a + b + 100
Anda dapat memengaruhi inferensi jenis dengan mengubah harfiah. Jika Anda membuat 100
menjadi uint32
dengan menambahkan sufiks u
, jenis a
, b
, dan nilai kembali disimpulkan menjadi uint32
.
Anda juga dapat memengaruhi inferensi jenis dengan menggunakan konstruksi lain yang menyiratkan pembatasan jenis, seperti fungsi dan metode yang bekerja hanya dengan jenis tertentu.
Selain itu, Anda dapat menerapkan anotasi jenis eksplisit ke parameter fungsi atau metode atau ke variabel dalam ekspresi, seperti yang ditunjukkan dalam contoh berikut. Kesalahan terjadi jika konflik terjadi antar batasan yang berbeda.
// Type annotations on a parameter.
let addu1 (x : uint32) y =
x + y
// Type annotations on an expression.
let addu2 x y =
(x : uint32) + y
Anda juga dapat secara eksplisit menentukan nilai kembali suatu fungsi dengan memberikan anotasi jenis setelah semua parameter.
let addu1 x y : uint32 =
x + y
Kasus umum yang anotasi jenisnya berguna pada parameter adalah ketika parameter adalah jenis objek dan Anda ingin menggunakan anggota.
let replace(str: string) =
str.Replace("A", "a")
Generalisasi Otomatis
Jika kode fungsi tidak bergantung pada jenis parameter, kompilator menganggap parameter tersebut generik. Ini disebut generalisasi otomatis, dan ini dapat menjadi bantuan yang ampuh untuk menulis kode generik tanpa menambah kompleksitas.
Misalnya, fungsi berikut menggabungkan dua parameter jenis apa pun menjadi tuple.
let makeTuple a b = (a, b)
Jenisnya disimpulkan sebagai
'a -> 'b -> 'a * 'b
Informasi Tambahan
Jenis inferensi dijelaskan secara lebih rinci dalam Spesifikasi Bahasa F#.