2014-04-13 31 views
5

W systemie typu the Hack language istnieje typ "top", znany również jako typ "any" lub uniwersalny typ "Object"? Oznacza to, że wszystkie typy są podklasami?Jaki jest najlepszy typ w języku Hack?

The manual mentions "mixed" types, które mogą być podobne, ale tak naprawdę nie są wyjaśnione. Istnieje również możliwość po prostu pominięcia deklaracji typu w niektórych miejscach. Jednak nie można tego zrobić wszędzie, np. jeśli chcę zadeklarować, że coś jest funkcją od string do najwyższego typu, nie jest jasne, jak to zrobić. function (string): mixed?

Odpowiedz

4

Jestem inżynierem pracującym na Hack na Facebooku. To naprawdę wnikliwe i interesujące pytanie. W zależności od tego, co dokładnie robisz, Hack ma kilka różnych odmian tego.

Po pierwsze, porozmawiajmy o mixed. Jest to supertype wszystkiego. Na przykład ten typechecks:

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

Ale ponieważ jest to supertypem wszystkiego, nie można zrobić wiele o wartości mixed aż przypadek analizować tego, co jest w rzeczywistości, poprzez is_int, instanceof, itd. Oto przykładem tego, jak trzeba by użyć wyniku f():

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

„brakującego adnotacja” typ („any”) jest nieco inna niż ta. Podczas gdy mixed jest nadtypem wszystkiego, "każdy" jednoczy ze wszystkim - jest podtypem wszystkiego podtypu i. Oznacza to, że jeśli zostawisz adnotację, zakładamy, że wiesz, co robisz i po prostu ją przepuszczasz. Na przykład, następujące typechecks code jak napisano:

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

Nie jest to oczywiście dźwięk - po prostu złamał system typu i spowoduje błąd typu Runtime jeśli wykonujemy powyższy kod - ale to dopuszczone w tryb częściowy w celu ułatwienia konwersji. Strict wymaga adnotacji wszystkiego, a więc nie można uzyskać wartości typu "any" w celu złamania systemu typu w ten sposób, jeśli cały kod jest ścisły. Zastanów się, w jaki sposób musiałbyś opisać powyższy kod w trybie ścisłym: albo f2 musiałby zwrócić int i byłby to błąd typu straight-up ("ciąg nie jest zgodny z int"), albo f2 musiałby zwrócić mixed i byłby to błąd typu zapisany ("ciąg nie jest zgodny z mieszanym"), dopóki nie wykonałeś analizy przypadku z is_int itd., tak jak w moim wcześniejszym przykładzie.

Mam nadzieję, że to wszystko wyjaśni - jeśli chcesz wyjaśnić, daj mi znać w komentarzach, a ja to zmienię. A jeśli masz inne pytania, które nie stanowią ścisłych wyjaśnień, kontynuuj oznaczanie ich tagami "hacklang", a my upewnimy się, że na nie odpowiedzą!

Wreszcie: jeśli nie miałbyś nic przeciwko, czy możesz nacisnąć przycisk "błąd dokumentacji" na stronach dokumentów, które były mylące lub niejasne, lub w jakikolwiek sposób można je poprawić? Idealnie chcemy, aby docs.hhvm.com było miejscem, w którym można umieścić takie rzeczy, ale są pewne dziury w dokumentach, które mamy nadzieję, że mądrzy, entuzjastyczni ludzie tacy jak ty pomogą wskazać. (tj., myślałem, że to zostało dobrze wyjaśnione w dokumentach, ale ponieważ jesteś zdezorientowany, to oczywiście nie jest to prawdą, i naprawdę docenilibyśmy raport o błędach, w którym zgubiłeś się.)

+0

Świetna odpowiedź, dzięki! Niektóre wyjaśnienia: (1) Za każdym razem, gdy pominięto adnotację, jest to równoważne z ': any'?(2) tryb "ścisły" powinien być w dobrym stanie, ale inne tryby są celowo niewłaściwe; czy to jest poprawne? Byłoby wspaniale, gdybyś mógł bardziej oficjalnie opublikować biały dokument opisujący system typów. Wydaje się, że system typu Hack jest na tyle innowacyjny, że zasługuje na coś takiego. Re błędów dokumentacji: zrobi! – jameshfisher

+0

1) Brak adnotacji jest typem "any", ale nie ma typu "any", który można jawnie napisać w kodzie. 2) Inne tryby są "celowo niesłuszne" to jeden ze sposobów, aby je wyrazić, ale myślimy o tym bardziej jako "dopisywanie dynamicznego typowania" i "zezwalaj na opóźnianie wymuszania typów do czasu wykonania" i "zezwalaj na pełną nieopisaną interoperacyjność PHP". Nie jestem pewien, czy mamy plan napisania białej księgi, czy cokolwiek, ale może powinniśmy, ponieważ wiele osób jest zainteresowanych :) Najnowsza rozmowa Hack Dev Day Juliena przechodzi do szczegółów wewnętrznych w drugiej połowie: https: // www .youtube.com/watch? v = BnJQJNGkUdM –

+0

Czy chodzi o punkt (1), czy to prawda? Więc co się dzieje w [tym przykładzie] (http://pastebin.com/wRXJLGQc), który typ sprawdza i działa bez błędu? Czy "dowolne" jest interpretowane tak, jak opisałeś powyżej, lub jako jakiś nieznany zwykły typ o nazwie "any", który w jakiś sposób nie generuje błędu typu? – jameshfisher