Sistema de tipo nominal - Nominal type system

Na ciência da computação , um sistema de tipo é um sistema de tipo nominal ou nominativo (ou sistema de tipo baseado em nome ) se a compatibilidade e equivalência de tipos de dados for determinada por declarações explícitas e / ou o nome dos tipos. Os sistemas nominais são usados ​​para determinar se os tipos são equivalentes, bem como se um tipo é um subtipo de outro. Os sistemas de tipo nominal contrastam com os sistemas estruturais , nos quais as comparações são baseadas na estrutura dos tipos em questão e não requerem declarações explícitas.

Tipagem Nominal

A tipagem nominal significa que duas variáveis ​​são compatíveis com o tipo se e somente se suas declarações nomeiam o mesmo tipo. Por exemplo, em C , dois struct tipos com nomes diferentes na mesma unidade de tradução nunca são considerados compatíveis, mesmo que tenham declarações de campo idênticas.

No entanto, C também permite uma typedef declaração, que introduz um alias para um tipo existente. Eles são meramente sintáticos e não diferenciam o tipo de seu alias para fins de verificação de tipo. Esse recurso, presente em muitas linguagens, pode resultar em uma perda de segurança de tipo quando (por exemplo) o mesmo tipo inteiro primitivo é usado de duas maneiras semanticamente distintas. Haskell fornece o apelido sintático de estilo C na forma da type declaração, bem como a newtype declaração que apresenta um tipo novo e distinto, isomórfico a um tipo existente.

Subtipagem nominal

De maneira semelhante, o subtipo nominal significa que um tipo é um subtipo de outro se e somente se for explicitamente declarado como sendo em sua definição. Linguagens com tipos nominais normalmente impõem o requisito de que os subtipos declarados sejam estruturalmente compatíveis (embora Eiffel permita que subtipos não compatíveis sejam declarados). No entanto, os subtipos que são estruturalmente compatíveis "por acidente", mas não declarados como subtipos, não são considerados subtipos.

C ++ , C # , Java , Objective-C , Delphi , Swift , Julia e Rust usam principalmente tanto a tipagem nominal quanto a subtipagem nominal.

Algumas linguagens com subtipagem nominal, como Java e C #, permitem que as classes sejam declaradas finais (ou lacradas na terminologia C #), indicando que nenhuma outra subtipagem é permitida.

Comparação

A tipagem nominal é útil na prevenção de equivalência de tipo acidental, o que permite melhor segurança de tipo do que a tipagem estrutural. O custo é uma flexibilidade reduzida, pois, por exemplo, a tipificação nominal não permite a criação de novos supertipos sem modificação dos subtipos existentes.

Veja também

Referências

Origens

links externos