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#.

Lihat juga