Saya ingin tahu apakah tipe dikuantifikasi secara universal : adalah sub-tipe, atau kasus khusus, dari tipe dikuantifikasi secara dengan tanda tangan yang sama:T a = ∀ X : { a ∈ X , f : X → { T , F } }
Saya akan mengatakan "ya": Jika ada sesuatu yang benar "untuk semua X" ( ), maka itu juga harus benar "untuk beberapa X" ( ). Artinya, pernyataan dengan ' ' hanyalah versi yang lebih terbatas dari pernyataan yang sama dengan ' ':∃ X ∀ ∃ ∀ X , P ( X ) ?
Apakah saya salah di suatu tempat?
Latar Belakang: Mengapa saya menanyakan hal ini?
Saya mempelajari tipe eksistensial untuk memahami mengapa dan bagaimana "Abstrak [Data] Jenis Memiliki Tipe Eksistensial" . Saya tidak bisa memahami konsep ini hanya dari teori; Saya perlu contoh nyata juga.
Sayangnya, contoh kode yang baik sulit ditemukan karena sebagian besar bahasa pemrograman hanya memiliki dukungan terbatas untuk jenis eksistensial. (Misalnya, Haskell
forall
, atau wildcard Java?
.) Di sisi lain, tipe yang dikuantifikasi secara universal didukung oleh banyak bahasa terkini melalui "generik".Yang lebih buruk, obat generik tampaknya mudah bercampur dengan tipe eksistensial , juga, membuatnya lebih sulit untuk membedakan eksistensial dari tipe universal. Saya ingin tahu mengapa percampuran ini terjadi begitu mudah. Sebuah jawaban untuk pertanyaan ini mungkin menjelaskannya: Jika tipe universal memang hanya merupakan kasus khusus dari tipe eksistensial, maka tidak mengherankan bahwa tipe generik, misalnya Java
List<T>
, dapat ditafsirkan dengan cara baik.
sumber
forall x. P(x)
begituexists x. P(x)
. Apakah sistem tipe mempertimbangkan hal ini saat memeriksa tipe ... Saya tidak tahu. +1 untuk pertanyaan yang menarik.Jawaban:
Jangan disesatkan oleh Haskell
forall
: meskipun namanya, itu adalah bentuk kuantifikasi eksistensial.Untuk latar belakang, saya sangat merekomendasikan Jenis dan Bahasa Pemrograman (bab 23 dan 24 masing-masing membahas tipe universal dan tipe eksistensial). Ini akan memberikan latar belakang yang berguna untuk memahami artikel penelitian.
sumber
forall
memang merupakan kuantifier universal dalam konteks asli kuantifikasi implisit yang dibuatnya eksplisit, yaitu melihat tipe polimorfik "dari luar" untuk definisi tingkat atas. Pada "bagian dalam" dari definisi semacam itu, ketika memanipulasi argumen, tipe polimorfik secara efektif eksistensial; setiap variabel tipe terikat ke beberapa tipe, tetapi kami tidak (dan tidak bisa) tahu apa tipe itu. Sepengetahuan saya, tidak ada implementasi Haskell yang mendukung tipe eksistensial sejati (mentah, tingkat atas), dan tidak jelas bagi saya tujuan apa yang bahkan dapat digunakan.Artikel yang Anda sebutkan untuk tipe eksistensial sedikit teoretis. Artikel tutorial lainnya adalah makalah Cardelli dan Wegner: Tentang memahami tipe, abstraksi data, dan polimorfisme . Sebagian besar buku teks canggih tentang bahasa pemrograman juga akan membahas beberapa jenis eksistensial. Buku yang bagus untuk dilihat adalah Yayasan Bahasa Pemrograman Mitchell .
Anda benar bahwa sebagian besar bahasa pemrograman tidak memiliki tipe eksistensial secara eksplisit. Namun, banyak yang memiliki tipe abstrak (atau dengan nama lain seperti "paket" atau "modul"). Jadi, mereka mampu mengekspresikan nilai tipe eksistensial, meskipun mereka tidak memperlakukan nilai-nilai seperti entitas kelas satu.
sumber