Saya sedang mempelajari sistem tipe murni, khususnya kalkulus konstruksi, dan mencoba menggunakan pengkodean untuk tipe rekursif di atasnya, yang, menurut Philip Wadler, adalah mungkin . Sebagai contoh, saya menggunakan perpustakaan Morte Haskell untuk menyandikan angka Scott seperti yang diberikan oleh Cardelli .
Ringkasan pengkodean adalah seperti itu: diberi jenis rekursif (positif) ...
... kita dapat menyandikannya sebagai tipe pada Sistem F sebagai ...
... atau, menggunakan notasi sistem tipe murni (dengan eksplisit ) ...
... karena adalah konstruktor tipe ( adalah tipe tipe).
Untuk mengkodekan seperti itu, kita perlu mendeklarasikan tiga fungsi, , dan , menurut Wadler, dan digunakan oleh Cardelli pada pengkodean untuk angka Scott.
lipat: Semua X. (FX -> X) -> T -> X
lipat = \ X. \ k: FX -> X. \ t: T. t X k
di: FT -> T
dalam = \ s: F T. \ X. \ k: FX -> X. k (F (lipat X k) s).
(Di mana adalah )
Itu sepele untuk menulis fungsi seperti yang diberikan. Tetapi ketika mencoba untuk menulis fungsi , sepertinya tidak mengetik centang. Ekspresi memiliki tipe , dan harus dari jenis . Kemudian kita menyimpulkan bahwa harus bertipe (terlihat seperti a ). Ini bukan typecheck, karena merupakan konstruktor tipe (bertipe ).fmap
F
Ini tidak terlihat seperti kesalahan ketik ... apakah saya melewatkan sesuatu?
sumber
fmap
! Saya mendapat nol pengalaman pada teori kategori, tetapi saya benar-benar menemukan bahwa sekitar 10 menit yang lalu pada "Catatan tentang Datatypes Kategorikal" (GC Wralth). Saya sekarang bisa menulis fungsi yang benar, bekerja seperti pesona. Terima kasih banyak, dr. Wadler! : D