Hace algún tiempo en una de las extensiones de Haskell (no se puede encontrar el enlace), y recently in Ur Encontré que los nombres (por ejemplo, de los campos de registro) forman una especie. ¿Alguien puede explicar por qué la abstracción de tipos no es suficiente para ellos?¿Por qué los nombres forman un tipo y no solo un tipo?
Respuesta
La respuesta es simple: porque pueden aparecer en tipos. En consecuencia, tienen que vivir en el nivel de tipo (de lo contrario necesitaría tipos dependientes). Y debido a que viven en el nivel de tipo, se clasifican por tipo.
Los sistemas de registro definen reglas para valores, tipos y (tal vez) tipos. Las reglas que se usan dependen del tipo de sistema que se diseña y de lo que el diseñador desea lograr.
E.g. en Haskell, sellos discográficos son:
- valores (las funciones de acceso)
- esos valores tienen tipos (por ejemplo
Record -> Int
) - esos tipos tienen clases (
*
)
Otros sistemas de registro puede use el tipo o el tipo de sistema para diferentes propósitos.
Al colocar las etiquetas en un tipo separado, el verificador de tipos puede tratarlas especialmente, con reglas especiales para, p. Ej. lentes automáticos, o pruebas que tienen que ver con la construcción de registros (tal vez la totalidad) no son ciertas para funciones de propósito general.
Un ejemplo del uso del sistema tipo en Haskell es el uso de "tipos no clasificados". Estos son los tipos que tienen:
- diferentes representaciones de tiempo de ejecución a valores regulares
- diferentes formas de unión (por ejemplo, no pueden ser asignados en el montón)
para mantener tipos sin caja de mezcla en con regulares tipos, se les da un tipo diferente , que permite al compilador rastrear su separación.
Por lo tanto, no hay nada de mágico en los nombres de las etiquetas discográficas, lo que significa que debe usar un tipo diferente para representarlos, y en un lenguaje dependiente como Ur o En verdad, esa puede ser una distinción útil.
Gracias, el ejemplo sobre los tipos sin caja es esclarecedor – Fixpoint
- 1. ¿Por qué no hay un tipo entero sin tamaño?
- 2. ¿Por qué no podemos bloquear un tipo de valor?
- 3. ¿Por qué un calificador de tipo en un tipo de retorno no tiene sentido?
- 4. ¿Qué es un tipo?
- 5. ¿Por qué no promete un tipo de datos en Scheme?
- 6. ¿Por qué esto no da un tipo de error?
- 7. ¿Por qué System.Enum no es un tipo de valor?
- 8. ¿Puede un tipo ser un tipo de referencia y un tipo de valor al mismo tiempo?
- 9. ¿Por qué no puedo definir un nuevo tipo en ghci?
- 10. ¿Por qué no es este un tipo de POD?
- 11. ¿Por qué los métodos parciales solo pueden tener un tipo de retorno anulado?
- 12. ¿Por qué usar el tipo de trabajo anónimo y usar un tipo explícito no en un GroupBy?
- 13. ¿Por qué no pueden los parámetros de tipo de plantilla no ser del tipo de clase
- 14. cadena en espacio de nombres std no nombra un tipo
- 15. ¿Qué es un subobjeto para un tipo?
- 16. ¿Cuál es la diferencia entre un tipo no administrado y un tipo gestionado?
- 17. Error: '...' no nombra un tipo
- 18. ¿Por qué no puedo usar un argumento de tipo en un parámetro de tipo con múltiples límites?
- 19. ¿Por qué se considera que un "tipo inestable" es malo
- 20. ¿Por qué RelayCommand o DelegateCommand no forman parte de WPF?
- 21. ¿Por qué debería usar var en lugar de un tipo?
- 22. ¿Qué tipo de firma de método prefiere y por qué?
- 23. Detectar si el tipo de un objeto es un tipo definido por .NET Framework
- 24. ¿Por qué un std :: vector no puede tomar un tipo local?
- 25. 'cout' no nombra un tipo
- 26. ¿Por qué Haskell inferiría un tipo específico (aparentemente) inconsistentemente?
- 27. Compruebe si los objetos tipo heredan un tipo abstracto
- 28. ¿Por qué usar = para inicializar un tipo primitivo en C++?
- 29. tipo anidado no puede ocultar un tipo adjunto
- 30. ¿Por qué null necesita un molde de tipo explícito aquí?
Esta respuesta ha puesto todo en su lugar en mi cabeza. ¡Gracias! – Fixpoint