Bagikan melalui


Inferensi Jenis

Topik ini menjelaskan bagaimana pengkompilasi F# menyimpulkan jenis nilai, variabel, parameter, dan nilai yang dikembalikan.

Ketik Inferensi secara Umum

Gagasan inferensi jenis adalah Bahwa Anda tidak perlu menentukan jenis konstruksi F# kecuali ketika kompilator tidak dapat secara konklusif menyimpulkan jenis. Menghilangkan informasi jenis eksplisit tidak berarti bahwa F# adalah bahasa yang ditik secara dinamis atau nilai-nilai dalam F# dititik dengan lemah. F# adalah bahasa yang diketik secara statis, yang berarti bahwa pengkompilasi menyimpulkan jenis yang tepat untuk setiap konstruksi selama kompilasi. Jika tidak ada cukup informasi bagi pengompilasi untuk menyimpulkan jenis setiap konstruksi, Anda harus menyediakan 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 di ketik 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, pengkompilasi menyimpulkan jenis berdasarkan konteks. Jika jenisnya tidak ditentukan lain, jenis tersebut disimpulkan sebagai generik. Jika kode menggunakan nilai secara tidak konsisten, sedemikian rupa sehingga tidak ada satu jenis yang disimpulkan yang memenuhi semua penggunaan nilai, pengkompilasi melaporkan kesalahan.

Jenis pengembalian fungsi ditentukan oleh jenis ekspresi terakhir dalam fungsi.

Misalnya, dalam kode berikut, jenis a parameter dan b dan jenis pengembalian semuanya disimpulkan int karena literal 100 berjenis int.

let f a b = a + b + 100

Anda dapat memengaruhi inferensi jenis dengan mengubah literal. Jika Anda membuat 100 dengan uint32 menambahkan akhiran u, jenis a, b, dan nilai pengembalian disimpulkan menjadi uint32.

Anda juga dapat memengaruhi inferensi jenis dengan menggunakan konstruksi lain yang menyiratkan pembatasan pada jenis, seperti fungsi dan metode yang hanya berfungsi 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 mengakibatkan jika konflik terjadi di antara 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 pengembalian fungsi dengan memberikan anotasi jenis setelah semua parameter.

let addu1 x y : uint32 =
   x + y

Kasus umum di mana anotasi jenis 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, pengkompilasi menganggap parameter tersebut generik. Ini disebut generalisasi otomatis, dan dapat menjadi bantuan yang kuat untuk menulis kode generik tanpa meningkatkan kompleksitas.

Misalnya, fungsi berikut menggabungkan dua parameter dari jenis apa pun ke dalam tuple.

let makeTuple a b = (a, b)

Jenis disimpulkan

'a -> 'b -> 'a * 'b

Informasi Tambahan

Inferensi jenis dijelaskan secara lebih rinci dalam Spesifikasi Bahasa F#.

Lihat juga