Saya melihat beberapa diskusi menarik di sini tentang pengetikan statis vs. dinamis. Saya biasanya lebih suka pengetikan statis, karena pemeriksaan jenis kompilasi, kode yang didokumentasikan lebih baik, dll. Namun, saya setuju bahwa mereka mengacaukan kode jika dilakukan dengan cara Java, misalnya.
Jadi saya akan mulai membangun bahasa gaya fungsional saya sendiri, dan jenis inferensi adalah salah satu hal yang ingin saya terapkan. Saya mengerti bahwa ini adalah subjek besar, dan saya tidak mencoba membuat sesuatu yang belum pernah dilakukan sebelumnya, hanya menyimpulkan dasar ...
Ada petunjuk tentang apa yang harus dibaca yang akan membantu saya dalam hal ini? Lebih disukai sesuatu yang lebih pragmatis / praktis dibandingkan dengan teks teori kategori / jenis teori yang lebih teoritis. Jika ada teks diskusi implementasi di luar sana, dengan struktur data / algoritme, itu akan menyenangkan.
Jawaban:
Saya menemukan sumber daya berikut berguna untuk memahami jenis inferensi, untuk meningkatkan kesulitan:
Namun, karena cara terbaik untuk belajar adalah melakukannya, saya sangat menyarankan penerapan inferensi tipe untuk bahasa fungsional mainan dengan mengerjakan tugas pekerjaan rumah dari kursus bahasa pemrograman.
Saya merekomendasikan dua pekerjaan rumah yang dapat diakses di ML ini, yang dapat Anda selesaikan dalam waktu kurang dari sehari:
Tugas ini berasal dari kursus yang lebih maju:
Menerapkan MiniML
Jenis Polimorfik, Eksistensial, Rekursif (PDF)
Pemeriksaan Ketikan Dua Arah (PDF)
Subtipe dan Objek (PDF)
sumber
Sangat disayangkan banyak literatur tentang masalah ini sangat padat. Saya juga berada di posisi Anda. Saya mendapatkan pengantar pertama saya untuk subjek dari Bahasa Pemrograman: Aplikasi dan Interpretasi
http://www.plai.org/
Saya akan mencoba meringkas ide abstrak diikuti dengan detail yang tidak langsung saya temukan dengan jelas. Pertama, jenis inferensi dapat dianggap menghasilkan dan kemudian memecahkan kendala. Untuk menghasilkan batasan, Anda mengulang melalui pohon sintaks dan menghasilkan satu atau lebih batasan pada setiap node. Misalnya, jika node adalah
+
operator, operan dan hasilnya harus berupa angka. Node yang menerapkan suatu fungsi memiliki tipe yang sama dengan hasil dari fungsi tersebut, dan seterusnya.Untuk bahasa tanpa
let
, Anda dapat menyelesaikan kendala di atas secara membabi buta dengan substitusi. Sebagai contoh:di sini, kita dapat mengatakan bahwa kondisi pernyataan jika harus Boolean, dan bahwa jenis pernyataan jika adalah sama dengan jenis yang
then
danelse
klausa. Karena kita tahu1
dan2
adalah angka, dengan substitusi, kita tahuif
pernyataannya adalah angka.Di mana hal-hal menjadi buruk, dan apa yang saya tidak bisa mengerti untuk sementara waktu, berurusan dengan biarkan:
Di sini, kita telah terikat
id
ke sebuah fungsi yang mengembalikan apa pun yang telah Anda teruskan, atau dikenal sebagai fungsi identitas. Masalahnya adalah jenis parameter fungsix
berbeda pada setiap penggunaanid
. Yang keduaid
adalah fungsi tipea -> a
, di manaa
bisa menjadi apa saja. Yang pertama adalah tipe(a -> a) -> (a -> a)
. Ini dikenal sebagai let-polymorphism. Kuncinya adalah memecahkan kendala dalam urutan tertentu: pertama-tama selesaikan kendala untuk definisiid
. Ini akan menjadia -> a
. Kemudian baru, salinan terpisah dari jenisid
dapat diganti menjadi batasan untuk setiap tempatid
digunakan, misalnyaa2 -> a2
dana3 -> a3
.Itu tidak mudah dijelaskan dalam sumber daya online. Mereka akan menyebutkan algoritma W atau M tetapi tidak bagaimana mereka bekerja dalam hal memecahkan kendala, atau mengapa tidak muncul pada let-polimorfisme: masing-masing algoritma tersebut memberlakukan urutan untuk memecahkan kendala.
Saya menemukan sumber daya ini sangat membantu untuk mengikat Algoritma W, M, dan konsep umum pembuatan kendala dan menyelesaikan semuanya bersama-sama. Ini sedikit padat, tapi lebih baik dari banyak:
http://www.cs.uu.nl/research/techreps/repo/CS-2002/2002-031.pdf
Banyak makalah lain di sana juga bagus:
http://people.cs.uu.nl/bastiaan/papers.html
Saya harap itu membantu menjelaskan dunia yang agak suram.
sumber
Selain Hindley Milner untuk bahasa fungsional, pendekatan populer lainnya untuk jenis inferensi untuk bahasa dinamis adalah
abstract interpretation
.Ide interpretasi abstrak adalah untuk menulis interpreter khusus untuk bahasa tersebut, alih-alih menjaga lingkungan nilai-nilai konkret (1, false, closure), ia bekerja pada nilai-nilai abstrak, alias tipe (int, bool, dll). Karena menafsirkan program pada nilai-nilai abstrak, itulah mengapa disebut interpretasi abstrak.
Pysonar2 adalah implementasi elegan dari interpretasi abstrak untuk Python. Ini digunakan oleh Google untuk menganalisis proyek Python. Pada dasarnya ini digunakan
visitor pattern
untuk mengirimkan panggilan evaluasi ke node AST yang relevan. Fungsi pengunjungtransform
menerimacontext
di mana node saat ini akan dievaluasi, dan mengembalikan jenis node saat ini.sumber
Jenis dan Bahasa Pemrograman oleh Benjamin C. Pierce
sumber
Lambda the Ultimate, mulai dari sini .
sumber