Estoy tratando de entender el artículo ΠΣ: Tipos dependientes sin el azúcar mediante la implementación de un intérprete y un corrector de tipo para el idioma. Al hacerlo, he visto que la unfold t as x -> u
sintaxis para definiciones recursivas (la sintaxis se define en la Sección 2.1) vincula una variable, pero no veo por qué es necesaria. Ninguno de los ejemplos en el documento realmente usa el enlace variable; todos usan una forma abreviada unfold t
(significado unfold t as x -> x
).
Yo no veo que el tipo de regla de verificación para ello (de la sección 5) utiliza la variable vinculante, pero no entiendo las implicaciones de esto. Por lo que puedo decir unfold t as x -> u
es completamente equivalente a let x = unfold t in u
.
¿Alguien puede proporcionar un ejemplo de cuándo el enlace variable es útil o necesario? ¿Hay algún término que verifique el tipo con la forma larga unfold
pero no con la forma corta y let
?
fuente
Respuestas:
No creo que haya ninguna razón mágica / necesaria. En mi opinión, está escrito de esa manera para que sea más obvio que
unfold
es una regla de eliminación analítica / de verificación; al igual que por quésplit
se escribe de la manera en que se escribe, en lugar de escribirse como primera y segunda proyección, y por quécase
se escribe de la manera en que se escribe,uneither
en lugar de escribirse como en Haskell.Con respecto al bit "analítico", observe cómo las otras reglas de eliminación son sintéticas / inferidas (beta) o bidireccionales (explosión)
fuente
!x
que no está escritoforce x as y -> y
. Ya sea que haya o no una razón más profunda, esta respuesta satisface mi curiosidad. ¡Gracias!