2014-04-13 6 views
5

In the Hack language sistema tipo, esiste un tipo "top", noto anche come "qualsiasi" tipo o di tipo universale "Oggetto"? Cioè, un tipo di cui tutti i tipi sono sottoclassi di?Qual è il tipo superiore nella lingua Hack?

The manual mentions "mixed" types, che potrebbe essere simile, ma non sono realmente spiegato. C'è anche la possibilità di omettere semplicemente la dichiarazione del tipo in alcuni punti. Tuttavia, questo non può essere fatto ovunque, ad es. se voglio dichiarare qualcosa come una funzione da string al tipo superiore, non è chiaro come faccio a farlo. function (string): mixed?

risposta

4

Sono un ingegnere che lavora su Hack Facebook. Questa è una domanda davvero interessante e interessante. A seconda di cosa stai ottenendo, Hack ha un paio di varianti diverse di questo.

In primo luogo, parliamo di mixed. È il supertipo di tutto. Ad esempio, questo typechecks:

<?hh // strict 
function f(): mixed { 
    return 42; 
} 

Ma dal momento che è il supertipo di tutto ciò, non si può fare molto con un valore mixed fino a caso analizzare su cosa sia in realtà, tramite is_int, instanceof, ecc Ecco un esempio di come dovreste usare il risultato di f():

<?hh // strict 
function g(): int { 
    $x = f(); 
    if (is_int($x)) { 
    return $x; 
    } else { 
    return 0; 
    } 
} 

il tipo "missing annotazione" ("qualsiasi") è un po 'diverso da questo. Considerando che il mixed è il supertipo di tutto, "qualsiasi" unifica con tutto - è sia il sottotipo sia il sottotipo di tutto. Ciò significa che se lasci un'annotazione, assumeremo che tu sappia cosa stai facendo e lascialo semplicemente passare. Ad esempio, i seguenti typechecks codice come scritto:

<?hh 
// No "strict" since we are omitting annotations 
function f2() { 
    return 42; 
} 
function g2(): string { 
    return f2(); 
} 

Questo chiaramente non è il suono - abbiamo appena rotto il sistema di tipi e causerà un errore di tipo runtime se eseguiamo il codice qui sopra - ma è ammesso in modalità parziale per facilitare la conversione. Strict richiede di annotare tutto e quindi non è possibile ottenere un valore di tipo "any" per rompere il sistema di tipi in questo modo se tutto il codice è rigoroso. Considera come dovresti annotare il codice sopra in modalità rigorosa: o f2 dovrebbe restituire int e quello sarebbe un errore di tipo diretto ("stringa non è compatibile con int") o f2 dovrebbe restituire mixed e quello sarebbe un errore di tipo come scritto ("stringa non è compatibile con mixed") fino a quando non hai fatto un'analisi del caso con is_int ecc. come ho fatto nel mio esempio precedente.

Spero che questo cancella le cose - se si vuole chiarimenti fatemi sapere nei commenti e Io modificare. E se hai altre domande che non sono dei chiarimenti rigorosi su questo, continua a taggarle "hacklang" e faremo in modo che rispondano!

Infine: se non ti dispiace, potresti premere il "file un bug di documentazione" nelle pagine dei documenti che erano confuse o poco chiare, o che potrebbero essere migliorate in alcun modo? Idealmente vogliamo che docs.hhvm.com sia un posto unico per cose come questa, ma ci sono sicuramente buchi nei documenti che speriamo che persone intelligenti ed entusiaste come te ti aiutino a sottolineare. (Vale a dire, ho pensato che questo roba è stato spiegato bene nella documentazione, ma dal momento che si sono confusi che è chiaramente non è il caso, e ci piacerebbe davvero apprezzare un bug report dettagliato in cui si è persa.)

+0

Grande risposta, grazie! Alcuni chiarimenti: (1) Ogni volta che un'annotazione viene omessa, equivale a ': any'?(2) si suppone che la modalità 'strict' sia sana, ma le altre modalità sono intenzionalmente non corrette; è giusto? Sarebbe bello se voi poteste pubblicare un white paper che descriva il sistema dei tipi in modo più formale. Sembra che il sistema di tipo Hack sia sufficientemente innovativo per meritare qualcosa del genere. Re problemi di documentazione: lo farò! – jameshfisher

+0

1) Un'annotazione mancante è il tipo "qualsiasi", sebbene non vi sia alcun tipo 'any' che è possibile scrivere esplicitamente nel codice. 2) Le altre modalità sono "intenzionalmente non corrette" è un modo per dirla, ma la pensiamo più come "ammettere la digitazione dinamica" e "permettere di ritardare l'applicazione del tipo fino al runtime" e "consentire un'interoperabilità PHP completa non tipizzata". Non sono sicuro se abbiamo un piano per scrivere un white paper o qualcosa del genere, anche se forse dovremmo visto che molte persone sono interessate :) Il recente discorso di Hack Dev Day di Julien si concentra su alcuni dettagli interni nella seconda parte: https: // www .youtube.com/watch? v = BnJQJNGkUdM –

+0

Punto Re (1), è proprio vero? Quindi cosa sta succedendo in [questo esempio] (http://pastebin.com/wRXJLGQc) che controlla e gira senza errori? Il 'any' viene interpretato come descritto sopra, o come un tipo ordinario sconosciuto chiamato' any' che in qualche modo non genera un errore di tipo? – jameshfisher

Problemi correlati