Codificação de tipo recursivo no sistema F (e outros sistemas de tipo puro)

8

Estou estudando sistemas de tipos puros, particularmente o cálculo de construções, e tentando usar uma codificação para tipos recursivos, o que, de acordo com Philip Wadler, é possível . Como exemplo, estou usando a biblioteca Morte Haskell para codificar números Scott, conforme dados por Cardelli .

Um resumo da codificação é assim: dado um tipo recursivo (positivo) ...

μX.F X

... podemos codificá-lo como um tipo no sistema F como ...

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

... ou usando a notação de sistemas de tipo puro (com um explícito ) ...F

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

... desde que é um construtor de tipos ( é o tipo de tipos).F

A fim de codificar tal, temos de declarar três funções, , e , de acordo com Wadler, e utilizado por Cardelli na codificação para numerais Scott.foldinout

fold: Todos os X. (FX -> X) -> T -> X

dobra = \ X. \ k: FX -> X. \ t: T. t X k

em: FT -> T

em = \ s: F T. \ X. \ k: FX -> X. k (F (dobra X k) s).

(Onde é )TLfix X.F X

É trivial escrever a função como dada. Mas, ao tentar escrever a função , não parece checar. A expressão tem tipo , e deve ser do tipo . Em seguida, inferimos que deve ser do tipo (se parece com a ). Isso não verifica, porque é um construtor de tipos (do tipo ).foldin(fold X k)TX(F (fold X k) s)F XF(TX)F TF XfmapF

Isso não parece um erro de digitação ... estou perdendo alguma coisa?

paulotorrens
fonte

Respostas:

7

Existe uma convenção na teoria das categorias de que o mesmo símbolo é usado para um construtor de tipos e a função de mapa sobre esse construtor de tipos. Portanto, se f: X -> Y, então F f: FX -> F Y.

Philip Wadler
fonte
Então é realmente um fmap! Não tenho experiência em teoria de categorias, mas na verdade descobri isso há cerca de 10 minutos em "Uma observação sobre tipos de dados categóricos" (GC Wralth). Agora eu era capaz de escrever a função correta, funcionava como um encanto. Muito obrigado, dr. Wadler! : D
paulotorrens 15/01