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 ).fmapF
Ini tidak terlihat seperti kesalahan ketik ... apakah saya melewatkan sesuatu?
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