Acabei de assistir essa palestra de Daniel Spiewak, onde ele fala sobre as vantagens da tipagem estrutural em comparação com a tipagem nominal de Scala e Java . Um exemplo para essa diferença seria o seguinte código Java
public interface Foo {
public int length();
}
public interface Bar {
public int length();
}
Foo f = ...;
Bar b = f;
que obviamente não seria compilado porque a compatibilidade de tipo entre Foo
e Bar
é determinada pelo nome.
Um sistema de tipo estrutural, por outro lado, poderia declarar que ambos os tipos são iguais ou compatíveis e, portanto, entre outras coisas, permitir a digitação de patos verificada.
Agora, acho que compreendo a maioria das vantagens de um sistema de tipo estrutural, mas me pergunto se isso não invalidaria a segurança de tipo de exemplos como os seguintes
class Foo {
class Bar { /* ... */ }
def takeBar(b: Bar) = { /* ... */ }
def getBar: Bar = new Bar
}
val foo1 = new Foo
val foo2 = new Foo
foo1.takeBar(foo1.getBar) // should compile
foo1.takeBar(foo2.getBar) // should not compile
Meu entendimento está correto de que, em um sistema de tipo estrutural, a última linha também seria compilada? Nesse caso, isso não seria uma desvantagem em relação à segurança de tipo?
fonte
Respostas:
Na verdade, os tipos dependentes de caminho são ortogonais à tipologia estrutural versus nominal. Não está realmente claro o que significa uma classe interna no contexto de uma linguagem simples do tipo estrutural. É, no entanto, muito possível definir isso. Se você definisse classes internas em um contexto de tipo estrutural, seria necessário garantir que casos como o que você listou fossem rejeitados (exatamente pelos mesmos motivos pelos quais Scala os rejeita).
Você rejeitaria esses casos fazendo o mesmo que Scala: modela o tipo dependente de caminho como um tipo existencial. O mesmo procedimento de empacotamento / descompactação em torno do acesso a objetos seria válido e os resultados pareceriam quase idênticos ao que Scala faz. Os resultados podem parecer uma igualdade de tipo nominal, mas ainda seria um sistema de tipo estrutural, pois a questão da compatibilidade de tipo ainda será decidida na interface, e não no nome.
A tipagem estrutural tem muitas implicações, mas (talvez surpreendentemente) a maioria dos mesmos conceitos que todos conhecemos e amamos dos sistemas de tipos nominais transitam para a estrutural. A digitação estrutural nada mais é do que uma maneira diferente de definir a compatibilidade de tipos.
fonte
A digitação estrutural facilita a gravação de código genérico da biblioteca. A principal razão pela qual o ecossistema Java é tão inchado é porque é difícil escrever pequenas bibliotecas facilmente. Se o Java fosse estruturalmente digitado, acho que seria uma história diferente e uma situação muito melhor.
A única desvantagem que posso pensar para a tipagem estrutural é o potencial de compilação mais lenta. Não tenho certeza se as linguagens estruturais geralmente compilam mais lentamente do que as nominativas ou não, mas, por exemplo, o Golang é tipicamente estrutural e muito rápido na compilação.
fonte