Vorrei sapere se un tipo : universalmente quantificato è un sottotipo, oppure caso speciale, di tipo quantificato con la stessa firma:
Direi "sì": se qualcosa è vero "per tutte le X" ( ), allora deve anche essere vero "per alcune X" ( ). Cioè, un'istruzione con ' ' è semplicemente una versione più limitata della stessa istruzione con ' ':
Sbaglio da qualche parte?
Contesto: perché lo sto chiedendo?
Sto studiando i tipi esistenziali per capire perché e come "I tipi astratti [di dati] hanno un tipo esistenziale" . Non riesco a capire bene questo concetto solo dalla teoria; Ho bisogno anche di esempi concreti.
Sfortunatamente, è difficile trovare buoni esempi di codice perché la maggior parte dei linguaggi di programmazione ha solo un supporto limitato per i tipi esistenziali. (Ad esempio, i caratteri jolly di Haskell
forall
o Java?
). D'altra parte, i tipi universalmente quantificati sono supportati da molte lingue recenti tramite "generici".Quel che è peggio, anche i generici sembrano facilmente confondersi con i tipi esistenziali , rendendo ancora più difficile distinguere i tipi esistenziali dai tipi universali. Sono curioso di sapere perché questo disordine si verifica così facilmente. Una risposta a questa domanda potrebbe spiegarlo: se i tipi universali sono davvero solo un caso speciale di tipi esistenziali, non c'è da meravigliarsi che i tipi generici, ad esempio Java
List<T>
, possano essere interpretati in entrambi i modi.
forall x. P(x)
allora exists x. P(x)
. Se i sistemi di tipo ne tengono conto quando si controllano i tipi ... Non ne ho idea. +1 per una domanda interessante.