stringtranslate.com

Sistema de tipos nominales

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 y/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.

Tipificación nominal

La tipificación nominal significa 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 con el propósito de verificar el tipo. Esta característica, presente en muchos lenguajes, puede resultar en una pérdida de seguridad de tipos cuando (por ejemplo) el mismo tipo entero primitivo se usa de dos maneras semánticamente distintas. Haskell proporciona el alias sintáctico al estilo C en la forma de la typedeclaración, así como la newtypedeclaración que sí introduce un tipo nuevo, distinto, isomorfo a un tipo existente. [1]

Subtipificación nominal

De manera similar, la subtipificación nominal significa que un tipo es un subtipo de otro si y solo si se declara explícitamente que lo es en su definición. Los lenguajes con tipificación 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 accidente", pero no se declaran como subtipos, no se consideran subtipos.

C++ , C# , Java , Kotlin , Objective-C , Delphi , Swift , Julia y Rust utilizan principalmente tipado nominal y subtipado nominal.

Algunos lenguajes con subtipos nominales, como Java y C#, permiten que las clases se declaren 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 evitar equivalencias de tipos accidentales, lo que permite una mayor seguridad de tipos que la tipificación estructural. El costo 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

  1. ^ "Haskell 2010 Report: Declaraciones y enlaces: tipos de datos definidos por el usuario". Archivado desde el original el 4 de enero de 2017. Consultado el 2 de junio de 2015 .

Fuentes

Enlaces externos