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) ...
... podemos codificá-lo como um tipo no sistema F como ...
... ou usando a notação de sistemas de tipo puro (com um explícito ) ...
... desde que é um construtor de tipos ( é o tipo de tipos).
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.
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 é )
É 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 ).fmap
F
Isso não parece um erro de digitação ... estou perdendo alguma coisa?
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