En informática , un sistema de tipos es nominal (también llamado nominativo o basado en nombres ) si la compatibilidad y equivalencia de los tipos de datos se determina mediante declaraciones explícitas o el nombre de los tipos. Los sistemas nominales se utilizan para determinar si los tipos son equivalentes, así como si un tipo es un subtipo de otro. Los sistemas de tipos nominales contrastan con los sistemas estructurales , donde las comparaciones se basan en la estructura de los tipos en cuestión y no requieren declaraciones explícitas.
Tipado nominal
La tipificación nominal implica que dos variables son compatibles en cuanto a tipos si y solo si sus declaraciones nombran el mismo tipo. Por ejemplo, en C , dos structtipos con nombres diferentes en la misma unidad de traducción nunca se consideran compatibles, incluso si tienen declaraciones de campo idénticas.
Sin embargo, C también permite una typedefdeclaración que introduce un alias para un tipo existente. Estas son meramente sintácticas y no diferencian el tipo de su alias a efectos de la verificación de tipos. Esta característica, presente en muchos lenguajes, puede provocar una pérdida de seguridad de tipos cuando (por ejemplo) se utiliza el mismo tipo entero primitivo de dos maneras semánticamente distintas. Haskell proporciona el alias sintáctico al estilo C en forma de typedeclaración, así como la newtypedeclaración que introduce un nuevo tipo distinto, isomorfo a un tipo existente. [ 1 ]
subtipificación nominal
De manera similar, el subtipado nominal implica que un tipo es subtipo de otro si y solo si se declara explícitamente como tal en su definición. Los lenguajes de tipado nominal suelen exigir que los subtipos declarados sean estructuralmente compatibles (aunque Eiffel permite declarar subtipos no compatibles). Sin embargo, los subtipos que son estructuralmente compatibles "por casualidad", pero que no se declaran como tales, no se consideran subtipos.
C++ , C# , Java , Kotlin , Objective-C , Delphi , Swift , Julia y Rust utilizan principalmente tanto tipado nominal como subtipado.
Algunos lenguajes con subtipos nominales, como Java y C#, permiten declarar las clases como finales (o selladas en la terminología de C#), lo que indica que no se permite ningún otro subtipo.
Comparación
La tipificación nominal es útil para prevenir la equivalencia de tipos accidental, lo que proporciona mayor seguridad de tipos que la tipificación estructural. El inconveniente es una menor flexibilidad, ya que, por ejemplo, la tipificación nominal no permite crear nuevos supertipos sin modificar los subtipos existentes.
Véase también
Referencias
- ↑ "Informe de Haskell 2010: Declaraciones y enlaces: Tipos de datos definidos por el usuario" . Archivado del original el 4 de enero de 2017. Consultado el 2 de junio de 2015 .
Fuentes
- Pierce, Benjamin C. (2002). «§19.3 Sistemas de tipos nominales y estructurales». Tipos y lenguajes de programación . MIT Press . págs. 253–. ISBN 0-262-16209-1.
Enlaces externos
- c2.com: Tipografía nominativa y estructural
- Sistemas de tipos