Saya mencoba untuk mempelajari lebih lanjut tentang pengecekan seluruh tipe program dan sistem inferensia tipe yang menggunakan informasi dari situs pemanggilan fungsi untuk menghitung informasi jenis (selain pendekatan standar menggunakan fungsi tubuh). Sebagai contoh, algoritma seperti itu mungkin menggunakan pemanggilan fungsi foo(1)
untuk menyimpulkan bahwa fungsi dalam foo
mengambil argumen integer. Jelas ini akan menyulitkan inferensi banyak dan membuat pemeriksaan menjadi non-modular.
Bagaimanapun, saya belum beruntung menemukan penelitian tentang pendekatan ini, mungkin karena saya tidak tahu terminologi yang tepat untuk menggambarkan apa yang saya bicarakan. Ada petunjuk?
Jawaban:
Hampir semua sistem dengan inferensi tipe menggunakan informasi situs panggilan untuk melakukan ini. Contohnya termasuk ML Standar, OCaml, F #, dan Haskell. Banyak bahasa lain menggunakan informasi situs panggilan untuk menyimpulkan instantiation parameter tipe, seperti Java, C #, Scala, dan Typed Racket. Ini sering kali disebut dengan nama "Local Type Inference".
Saya hanya akan menggambarkan apa yang Anda cari sebagai "Ketik Inferensi", dan Anda mungkin harus mulai dengan mencari apa yang dikenal sebagai sistem "Hindley-Milner". Halaman Wikipedia memberikan pengantar yang masuk akal, dan menunjuk ke makalah asli.
Tempat untuk memulai Inferensi Jenis Lokal adalah kertas asli Pierce dan Turner, paling baik dibaca dalam versi TOPLAS 2000 ( ACM , PDF ).
sumber
Anda dapat melihat pada sistem tipe untuk tipe persimpangan yang dapat memberi Anda sesuatu seperti
a :: Int -> Int | Bool -> Bool
, sehingga Anda tahu bahwa dua spesialisasiInt
danBool
cukup, atau menggunakan inferensi tipe biasa untuk menyimpulkan sebagian besar tipe umum diikuti dengan analisis aliran kontrol untuk mengumpulkan aktual ketik argumen. Bahkan ada pendekatan hybrid (CFA dinyatakan sebagai sistem tipe dan sebaliknya).Penelitian berfungsi untuk menyimpulkan paling tidak tipe umum daripada tipe paling umum yang mungkin ada, tetapi saya tidak menyadarinya.
Adapun teknik untuk menerapkan polimorfisme, ada dua solusi: 1) spesialisasi (pikirkan template C ++) 2) asumsi representasi seragam (pikirkan koleksi gaya-C dengan void *).
Untuk 2, Anda tidak perlu mengetik dari situs panggilan selama pemeriksaan ketik, dan dapat mendukung kompilasi terpisah dengan lebih mudah.
Perhatikan bahwa kita berbicara tentang polimorfisme parametrik di sini, dan pemanggilan metode virtual OO adalah hal yang sama sekali berbeda yang disebut polimorfisme subtipe. Perhatikan bahwa templat C ++ mendukung sesuatu seperti polimorfisme parametrik dan pengetikan bebek, yang merupakan bentuk lain polimorfisme.
sumber