Estou tentando entender o documento ΠΣ: Tipos dependentes sem o Sugar , implementando um intérprete e um verificador de tipos para o idioma. Ao fazer isso, vi que a unfold t as x -> u
sintaxe para definições recursivas (a sintaxe é definida na Seção 2.1) vincula uma variável, mas não vejo por que isso é necessário. Nenhum dos exemplos do artigo realmente usa a variável de encadernação - todos eles usam um formato abreviado unfold t
(significado unfold t as x -> x
).
Eu não ver que o tipo de verificação regra para isso (da seção 5) usa a variável de ligação, mas eu não entendo as implicações desta. Tanto quanto eu posso dizer, unfold t as x -> u
é totalmente equivalente a let x = unfold t in u
.
Alguém pode fornecer um exemplo de quando a ligação de variável é útil ou necessária? Existe algum termo que verifica o tipo com o formato longo, unfold
mas não com o formato curto e let
?
fonte
Respostas:
Eu não acho que haja qualquer razão mágica / necessária. Na IMO, está escrito dessa maneira para tornar mais óbvio que
unfold
é uma regra de eliminação analítica / de verificação; assim como por quesplit
está escrito do jeito que está, em vez de ser escrito como primeira e segunda projeções, e por quecase
está escrito do jeito que está, em vez de ser escrito comouneither
em Haskell.No bit "analítico", observe como as outras regras de eliminação são sintéticas / inferenciais (beta) ou bidirecionais (bang)
fonte
!x
não está escritoforce x as y -> y
. Independentemente de haver uma razão mais profunda, essa resposta satisfaz minha curiosidade. Obrigado!