No artigo de Eric Lippert What's Up With notation húngaro? , ele afirma que o objetivo da notação húngara (o tipo bom) é
estenda o conceito de "tipo" para incluir informações semânticas, além de informações de representação de armazenamento.
Um exemplo simples seria o prefixo de uma variável que representa uma coordenada X com "x" e uma variável que representa uma coordenada Y com "y", independentemente de essas variáveis serem números inteiros ou flutuantes ou qualquer outra coisa, para que quando você escrever acidentalmente xFoo + yBar
, o código parece claramente errado.
Mas eu também tenho lido sobre o sistema de tipos de Haskell, e parece que em Haskell, é possível realizar a mesma coisa (por exemplo, "estender o conceito de tipo para incluir informações semânticas") usando tipos reais que o compilador verificará por você. Portanto, no exemplo acima, o xFoo + yBar
Haskell falharia na compilação se você projetasse seu programa corretamente, pois eles seriam declarados como tipos incompatíveis. Em outras palavras, parece que o sistema de tipos de Haskell suporta efetivamente a verificação em tempo de compilação equivalente à notação húngara
Então, a Notação Húngara é apenas um band-aid para linguagens de programação cujos sistemas de tipos não podem codificar informações semânticas? Ou a notação húngara oferece algo além do que um sistema de tipo estático como o de Haskell pode oferecer?
(Claro, estou usando Haskell como exemplo. Tenho certeza de que há outras linguagens com sistemas do tipo similarmente expressivo (rico? Forte?), Embora não tenha encontrado nenhum.)
Para ser claro, eu estou não falar de anotar os nomes das variáveis com o dados tipo, mas sim com informações sobre o significado da variável no contexto do programa. Por exemplo, uma variável pode ser um número inteiro ou flutuante ou duplo ou longo ou o que for, mas talvez o significado da variável seja que seja uma coordenada x relativa medida em polegadas. Este é o tipo de informação que estou falando sobre codificação via notação húngara (e via tipos Haskell).