(Dis-) vantaggi della tipizzazione strutturale

15

Ho appena visto questo talk di Daniel Spiewak dove parla dei vantaggi di tipizzazione strutturale rispetto alla digitazione nominale di Scala ans Java. Un esempio di questa differenza sarebbe il seguente codice Java

public interface Foo {
  public int length();
}
public interface Bar {
  public int length();
}

Foo f = ...;
Bar b = f;

che ovviamente non verrebbe compilato perché la compatibilità di tipo tra Foo e Bar è determinata dal nome.

Un sistema di tipo strutturale, d'altra parte, potrebbe dichiarare entrambi i tipi uguali o compatibili e quindi, tra le altre cose, consentire la digitazione controllata degli anatra.

Ora penso di capire la maggior parte dei vantaggi di un sistema di tipo strutturale, ma mi chiedo se non invalida la sicurezza del tipo da esempi come il seguente

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

La mia comprensione è corretta sul fatto che in un sistema di tipo strutturale anche l'ultima riga dovrebbe essere compilata e, in tal caso, non sarebbe uno svantaggio rispetto alla sicurezza del tipo?

    
posta Debilski 07.11.2011 - 15:20
fonte

2 risposte

12

In realtà, i tipi di path-dependent sono ortogonali alla tipizzazione strutturale vs nominale. Non è molto chiaro cosa significhi una classe interiore nel contesto di un semplice linguaggio tipizzato strutturalmente. Tuttavia, è molto possibile definirlo . Se dovessi definire le classi interne in un contesto tipizzato strutturalmente, dovresti assicurarti che casi come quello che hai elencato vengano rifiutati (per gli stessi motivi per cui Scala li respinge).

Rifiuteresti tali casi facendo la stessa cosa che Scala fa: modella il tipo dipendente dal percorso come un tipo esistenziale. La stessa procedura di pack / unpack che circonda l'accesso agli oggetti si manterrebbe, ei risultati sembrerebbero quasi identici a quelli di Scala. I risultati potrebbero sembrare come un'uguaglianza di tipo nominale, ma sarebbe comunque un sistema di tipo strutturale poiché la questione della compatibilità dei tipi verrà comunque decisa sull'interfaccia anziché sul nome.

La tipizzazione strutturale ha molte implicazioni, ma (forse sorprendentemente) la maggior parte degli stessi concetti che tutti conosciamo e amiamo dai sistemi di tipo nominale trasferiscono in strutturali. La tipizzazione strutturale non è altro che un modo diverso di definire la compatibilità dei tipi.

    
risposta data 07.11.2011 - 16:33
fonte
0

La tipizzazione strutturale facilita la scrittura del codice di una libreria generica. Il motivo numero 1 per cui l'ecosistema Java è così gonfio è perché è difficile scrivere facilmente piccole librerie. Se Java fosse strutturalmente tipizzato, penso che sarebbe una storia diversa e una situazione molto migliore.

L'unico svantaggio che posso pensare per la tipizzazione strutturale è il potenziale per la compilazione più lenta. Non sono sicuro che i linguaggi strutturali generalmente si compilino più lentamente di quelli nominativi o meno, ma ad esempio Golang è tipizzato strutturalmente e molto veloce nella compilazione.

    
risposta data 21.12.2018 - 09:12
fonte

Leggi altre domande sui tag