2014-04-13 18 views
5

In the Hack language Typ System gibt es einen "Top" -Typ, auch bekannt als "Any" -Typ oder ein universeller "Object" -Typ? Das heißt, ein Typ, von dem alle Typen Unterklassen sind?Was ist der Top-Typ in der Hack-Sprache?

The manual mentions "mixed" types, die ähnlich sein könnten, aber nicht wirklich erklärt werden. Es besteht auch die Möglichkeit, die Typdeklaration an einigen Stellen einfach wegzulassen. Dies kann jedoch nicht überall, z.B. wenn ich etwas zu einer Funktion von string zum obersten Typ erklären will, ist es nicht klar, wie ich das tue. function (string): mixed?

Antwort

4

Ich bin ein Ingenieur arbeitet an Hack bei Facebook. Dies ist eine wirklich aufschlussreiche und interessante Frage. Abhängig davon, was Sie gerade tun, hat Hack ein paar verschiedene Variationen davon.

Lassen Sie uns zuerst über mixed sprechen. Es ist der Supertyp von allem. Zum Beispiel typechecks dies:

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

Aber da es der übergeordneten Typ von allem ist, kann man nicht mit einem mixed Wert viel tun, bis Sie Fall analysieren darauf, was tatsächlich ist, über is_int, instanceof usw. eine hier Beispiel dafür, wie Sie das Ergebnis f() verwenden müßten:

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

der „fehlende Anmerkung“ Typ („any“) ist etwas anders als diese. Während mixed ist der Supertyp von allem, "any" vereint mit allem - es ist sowohl der Supertyp und Untertyp von allem. Dies bedeutet, dass Sie, wenn Sie eine Anmerkung weglassen, annehmen, dass Sie wissen, was Sie tun, und lassen Sie es einfach passieren. Zum Beispiel können die folgenden Code typechecks wie geschrieben:

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

eindeutig ist dies nicht klingen - wir brachen nur die Art System und wird eine Laufzeittyp Fehler verursachen, wenn wir den obigen Code ausführen - aber es ist zugelassen in Teilmodus, um die Umwandlung zu erleichtern. Strict erfordert, dass Sie alles mit Anmerkungen versehen, und daher können Sie keinen Wert vom Typ "any" erhalten, um das Typsystem auf diese Weise zu unterbrechen, wenn Ihr gesamter Code streng ist. Überlegen Sie, wie Sie den obigen Code im strikten Modus kommentieren müssten: entweder f2 würde int zurückgeben und das wäre ein Straight-Up-Typ-Fehler ("String ist nicht kompatibel mit Int"), oder f2 müsste mixed zurückgeben und das wäre ein Schreibfehler wie geschrieben ("String ist nicht kompatibel mit gemischt"), bis Sie eine Fallanalyse mit is_int etc, wie ich in meinem früheren Beispiel getan habe.

Hoffe das klärt die Dinge auf - wenn Sie die Klärung wollen, lassen Sie mich in den Kommentaren wissen, und ich werde bearbeiten. Und wenn Sie andere Fragen haben, die keine strengen Klärungen sind, markieren Sie sie weiterhin "hacklang" und wir werden sicherstellen, dass sie darauf reagieren!

Endlich: Wenn es Ihnen nichts ausmacht, könnten Sie auf den Dokumentenseiten, die verwirrend oder unklar sind oder auf irgendeine Weise verbessert werden könnten, auf "Dokumentationsfehler ablegen" drücken? Im Idealfall möchten wir, dass docs.hhvm.com eine zentrale Anlaufstelle für solche Sachen ist, aber es gibt definitiv Löcher in den Dokumenten, auf die wir hoffen, dass intelligente, enthusiastische Leute wie Sie darauf hinweisen werden. (d. h., ich dachte, dass dieses Zeug in den Dokumenten gut erklärt wurde, aber da Sie verwirrt sind, ist dies eindeutig nicht der Fall, und wir würden einen Fehlerbericht sehr schätzen, in dem Sie genau wissen, wo Sie sich verirrt haben.)

+0

Große Antwort, danke! Einige Klarstellungen: (1) Jedes Mal, wenn eine Annotation weggelassen wird, entspricht sie ": any"?(2) der "strikte" Modus soll gesund sein, aber die anderen Modi sind absichtlich ungesund; Ist das richtig? Es wäre großartig, wenn Sie ein Whitepaper veröffentlichen könnten, das das Typsystem formaler beschreibt. Es fühlt sich an, als wäre das Hack-System ausreichend innovativ, um so etwas zu verdienen. Re Dokumentationsfehler: werden! – jameshfisher

+0

1) Eine fehlende Annotation ist der Typ "any", obwohl es keinen Typ 'any' gibt, den Sie explizit in Ihren Code schreiben können. 2) Die anderen Modi sind "absichtlich unzuverlässig" ist eine Möglichkeit, es zu sagen, aber wir denken, es mehr als "zugeben, dynamische Typisierung" und "erlauben verzögern Typ Durchsetzung bis zur Laufzeit" und "ermöglichen vollständige untypisierte PHP-Interoperabilität". Ich bin nicht sicher, ob wir einen Plan haben, ein Whitepaper oder etwas zu schreiben, obwohl wir vielleicht sollten, da viele Leute interessiert sind :) Juliens letzter Hack Dev Day Vortrag geht in einige interne Details in der zweiten Hälfte: https: // www .youtube.com/watch? v = BnJQJNGkUdM –

+0

Re Punkt (1), ist das wirklich wahr? Dann, was passiert in [diesem Beispiel] (http://pastebin.com/wRXJLGQc) welcher Typ prüft und läuft ohne Fehler? Wird das 'any' interpretiert, wie oben beschrieben, oder als ein unbekannter gewöhnlicher Typ namens' any', der irgendwie keinen Typfehler erzeugt? – jameshfisher