tipo ha inferito le lingue tipizzate staticamente?

0

ci sono delle lingue typesafe senza tipo? Per typesafe intendo i tipi controllati in fase di compilazione. Con typeless significo che i tipi non sono dichiarati.

So che è più facile di quanto sembri, forse anche impossibile, ma ad esempio se avessi codice come questo

foo = {
   bar: 123;
}

In qualche linguaggio immaginario posso sapere che bar è un int e foo è una struct / object / class con 1 campo int.

Allo stesso modo se faccio questo

SomeFunc(v) {
  printInt(v.bar);
}

E altrove lo faccio

SomeFunc(foo);

Tutto ciò sembra controllabile in fase di compilazione. Con un contesto sufficiente potrebbe persino essere controllabile tramite le unità di compilazione.

Ci sono lingue che hanno tentato questo? In pratica, è possibile dichiarare raramente i tipi e tuttavia essere ancora tipografici al momento della compilazione?

    
posta gman 19.11.2014 - 22:14
fonte

4 risposte

10

Sì, praticamente tutto ciò che fa parte della famiglia Haskell / ML. Ecco uno snippet di alcuni Haskell pertinenti

 foo = 1 + bar
 bar = "Not a number :O"
 main = putStrLn foo

Nessun tipo deve essere esplicitamente annotato, ma l'errore è ancora catturato in fase di compilazione. In generale deduciamo sempre alcuni tipi in ogni lingua. Niente richiederebbe qualcosa di simile

int bar = 1;
foo((bar : int) + (1 : int) : int) : string

Tutti supportano almeno la deduzione dei tipi per sottoespressioni perché altrimenti la lingua è semplicemente non scrivibile. Solitamente il tipografo che esegue il compilatore annoterà l'albero sintassi astratto con questi tipi. Solo poche lingue supportano l'inferenza di tipo globale, in cui non è necessario scrivere alcun tipo. Ci sono alcune caratteristiche che in generale rendono l'inferenza del tipo completa difficile o impossibile. Un elenco incompleto

  • Sottotipizzazione
  • Polimorfismo di rango 3 o superiore
  • Tipi dipendenti
  • Un linguaggio completamente monomorfico (in realtà è solo ambiguo senza alcune annotazioni)

PS Volevo solo prendere una nota sulla terminologia: digitare safe di solito significa che un programma ben scritto ha sempre un comportamento definito. Python è di tipo sicuro e digitato in modo dinamico, C non è sicuro da un tipo e viene digitato staticamente.

Penso che quello che vuoi dire è un linguaggio tipizzato staticamente che non richiede annotazioni di tipo:)

    
risposta data 19.11.2014 - 22:40
fonte
6

L'inferenza del tipo fa esattamente questo. In genere non è necessario dichiarare i tipi, in quanto possono essere dedotti dall'utilizzo. Tuttavia, i sistemi di tipi più complessi continueranno a richiedere occasionalmente annotazioni di tipo esplicito.

Il tuo esempio può essere scritto in Standard ML come

fun some_func {bar} = print (Int.toString bar);

val foo = {bar = 123};
some_func foo;

Utilizza la corrispondenza del modello per ottenere il campo bar nel record passato a some_func . Il linguaggio ML è stato pioniere dell'inferenza di tipo, ma l'inferenza di tipo sta diventando una visione più comune con vari livelli di supporto in Haskell, C ++, C # e Scala.

    
risposta data 19.11.2014 - 22:40
fonte
1

Le risposte finora hanno menzionato i linguaggi funzionali estremi. Se stai cercando qualcosa di più vicino al mainstream, dai un'occhiata a Boo. La sua sintassi è strongmente ispirata a Python, ma è tipizzata staticamente. Le dichiarazioni di tipo sono necessarie per la definizione dei membri della classe, ma per le variabili, gli argomenti del metodo e i tipi restituiti, a ogni elemento può essere dato facoltativamente un tipo esplicito o inferto dal tipo se non ne viene fornito nessuno.

    
risposta data 20.11.2014 - 04:44
fonte
0

Forse il meno hard-core dei suggerimenti se FlowType (fondamentalmente non è un linguaggio, ma un sistema di annotazione del tipo per JavaScript). È implementato usando OCaml e ha inferenza di tipo abbastanza potente. Non penso che un compito reale possa essere basato sul codice solo per l'inferenza di tipo, ma in generale FlowType può inferire tipi per la maggior parte dei casi.

Si può giocare con esso qui .

    
risposta data 03.02.2018 - 16:48
fonte

Leggi altre domande sui tag