Pengkodean tipe rekursif pada Sistem F (dan sistem tipe murni lainnya)

8

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) ...

μX.F X

... kita dapat menyandikannya sebagai tipe pada Sistem F sebagai ...

Lfix X.F X = ΛX.(F XX)X

... atau, menggunakan notasi sistem tipe murni (dengan eksplisit ) ...F

Lfix = ΠF:.ΠX:.(F XX)X

... karena adalah konstruktor tipe ( adalah tipe tipe).F

Untuk mengkodekan seperti itu, kita perlu mendeklarasikan tiga fungsi, , dan , menurut Wadler, dan digunakan oleh Cardelli pada pengkodean untuk angka Scott.foldinout

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 )TLfix X.F X

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 ).foldin(fold X k)TX(F (fold X k) s)F XF(TX)F TF XfmapF

Ini tidak terlihat seperti kesalahan ketik ... apakah saya melewatkan sesuatu?

paulotorrens
sumber

Jawaban:

7

Ada konvensi dalam teori kategori bahwa simbol yang sama digunakan untuk konstruktor tipe dan fungsi peta di atas konstruktor tipe tersebut. Karenanya, jika f: X -> Y maka F f: FX -> F Y.

Philip Wadler
sumber
Jadi itu memang 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
paulotorrens