Bahasa fungsional dapat dilihat sebagai kategori di mana objeknya adalah tipe dan fungsi morfisme di antara mereka.
Bagaimana kelas tipe cocok dengan model ini?
Saya berasumsi bahwa kita hanya harus mempertimbangkan implementasi yang memenuhi batasan yang dimiliki sebagian besar tipe-kelas, tetapi tidak diungkapkan dalam Haskell. Sebagai contoh, kita hanya harus mempertimbangkan implementasi Functor
yang fmap id ≡ id
dan fmap f . fmap g ≡ fmap (f . g)
.
Atau apakah ada dasar teoretis lain untuk kelas tipe (misalnya berdasarkan pada kalkulasi lambda yang diketik)?
lo.logic
functional-programming
ct.category-theory
denotational-semantics
type-systems
Petr Pudlák
sumber
sumber
Jawaban:
Jawaban singkatnya adalah: tidak.
Setiap kali Anda memperkenalkan paksaan, mengetik kelas, atau mekanisme lain untuk polimorfisme ad-hoc ke dalam bahasa, masalah desain utama yang Anda hadapi adalah koherensi .
Pada dasarnya, Anda perlu memastikan bahwa resolusi typeclass adalah deterministik, sehingga program yang diketik dengan baik memiliki interpretasi tunggal. Misalnya, jika Anda bisa memberikan beberapa instance untuk tipe yang sama dalam cakupan yang sama, Anda berpotensi menulis program ambigu seperti ini:
Bergantung pada pilihan contoh yang dibuat oleh kompiler,
blah v
dapat sama dengan"Hello"
atau"Goodbye"
. Oleh karena itu, arti dari suatu program tidak akan sepenuhnya ditentukan oleh sintaks program, tetapi lebih dapat dipengaruhi oleh pilihan sewenang-wenang yang dibuat oleh kompiler.Solusi Haskell untuk masalah ini adalah mengharuskan setiap tipe memiliki paling banyak satu instance untuk setiap typeclass. Untuk memastikan hal ini, ia mengizinkan deklarasi instance hanya di tingkat atas, dan selanjutnya membuat semua deklarasi terlihat secara global. Dengan begitu, kompiler selalu dapat memberi sinyal kesalahan jika deklarasi instance ambigu dibuat.
Namun, membuat deklarasi terlihat secara global merusak komposisionalitas semantik. Apa yang dapat Anda lakukan untuk memulihkan adalah memberikan semantik elaborasi untuk bahasa pemrograman - yaitu, Anda dapat menunjukkan cara menerjemahkan program Haskell ke dalam bahasa yang berperilaku lebih baik, lebih komposisional.
Ini sebenarnya memberi Anda cara untuk mengkompilasi kacamata ketik - juga biasanya disebut "terjemahan bukti" atau "transformasi kamus-lewat" di lingkaran Haskell, dan merupakan salah satu tahap awal dari kebanyakan kompiler Haskell.
Typeclasses juga merupakan contoh yang baik tentang bagaimana desain bahasa pemrograman berbeda dari teori tipe murni. Typeclasses adalah fitur bahasa yang benar-benar luar biasa, tetapi mereka cukup berperilaku buruk dari sudut pandang teori bukti. (Inilah sebabnya mengapa Agda tidak memiliki kacamata ketik sama sekali, dan mengapa Coq menjadikannya bagian dari infrastruktur inferensi heuristiknya.)
sumber