2014-04-13 7 views
5

the Hack language 유형 시스템에는 "모든"유형 또는 범용 "객체"유형이라고도하는 "상단"유형이 있습니까? 즉, 모든 유형이 하위 유형 인 유형입니까?해킹 언어의 상위 유형은 무엇입니까?

The manual mentions "mixed" types 유사 할 수도 있지만 실제로 설명되지는 않습니다. 또한 일부 장소에서 단순히 타입 선언을 생략 할 수도 있습니다. 그러나 모든 곳에서이 작업을 수행 할 수는 없습니다. 만약 내가 뭔가를 선언하고자한다면 string에서 꼭대기 유형으로, 내가 어떻게하는지 분명하지 않다. function (string): mixed?

답변

4

저는 페이스 북의 해킹을 담당하는 엔지니어입니다. 이것은 정말로 통찰력 있고 흥미로운 질문입니다. 정확히 무엇을하고 있는지에 따라 해킹에는 몇 가지 다른 변형이 있습니다.

먼저, mixed에 대해 이야기 해 봅시다. 그것은 모든 것의 수퍼 타입입니다.

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

을하지만이 모든 것의 슈퍼는 이후 당신이 경우 실제로 무엇인가를 분석 할 때까지 등이 여기입니다 is_int, instanceof 통해하는 mixed 값을 많이 할 수 없습니다 예를 들어,이 typechecks 당신이 f()의 결과를 사용해야 할 것입니다 방법의 예 :

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

은 "실종 주석"유형 ("모든")는이보다 다소 다르다. mixed이 모든 것의 상위 유형 인 반면, "임의"을 모든 것으로 통합합니다. 모든 유형의 수퍼 유형 입니다. 즉, 주석을 남기면 우리는 자신이하고있는 일을 알고 있다고 가정합니다. 우리는 단지 형식 시스템을 깨고 우리가 위의 코드를 실행하면 런타임 유형 오류가 발생합니다 - - 소리가되지 명확하게

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

이를 있지만에서 인정 있어요 예를 들어, 다음 코드 typechecks가 기록으로 변환을 쉽게하기 위해 부분 모드. Strict는 모든 것에 주석을 달 것을 요구하므로, 모든 코드가 엄격하다면 이런 방식으로 타입 시스템을 깨기 위해 "any"타입의 값을 얻을 수 없습니다. 위의 코드에 엄격 모드로 주석을 추가하는 방법을 고려하십시오. f2int을 반환해야하며 이는 곧은 유형 오류 ("문자열은 int와 호환되지 않습니다")이거나 f2mixed을 반환해야합니다. 이전 예제에서와 마찬가지로 is_int 등의 사례 분석을 수행 할 때까지 서면으로 "(문자열은 혼합과 호환되지 않습니다.") 형식 오류가됩니다.

희망 사항이 문제를 해결합니다. 설명을 원하면 의견을 보내 주시면 수정하겠습니다. 그리고 이것에 대한 엄격한 설명이 아닌 다른 질문이있는 경우 "hacklang"태그를 계속 추가하면 답변을 받게됩니다!

마지막으로, 혼란 스럽거나 불분명하거나 어떤 식 으로든 개선 될 수있는 문서 페이지에서 "문서 버그를 신고"할 수 있습니까? 우리는 이상적으로 docs.hhvm.com이 이런 식의 원 스톱 장소가되기를 바랍니다. 그러나 우리가 똑똑하고 열렬한 사람들이 자신이 원하는 바를 지적하기를 바랍니다. (즉,이 내용은 문서에서 잘 설명되었다고 생각했지만, 혼동 스럽기 때문에 명확히 알 수없는 버그 보고서를 보내 주시면 감사하겠습니다.)

+0

감사합니다. 몇 가지 설명 : (1) 주석을 생략 할 때마다': any'와 동일합니까?(2)'strict' 모드는 소리가 나는 것으로 가정되지만, 다른 모드는 의도적으로 불투명합니다. 이게 옳은 거니? 여러분이 형식 시스템을보다 공식적으로 설명하는 백서를 발표 할 수 있다면 좋을 것입니다. 해킹 유형 시스템이 이와 같이 가치가있는 혁신적인 것으로 느껴집니다. 다시 설명서 버그 : 할 것입니다! – jameshfisher

+0

1) 누락 된 주석은 "모든"유형입니다. 코드에 명시 적으로 작성할 수있는 유형이 '모든'유형은 없습니다. 2) 다른 모드는 "의도적으로 불건전"한 방법이지만, "동적 타이핑 허용"과 "런타임까지 유형 강제 실행 지연"및 "완전한 유형화되지 않은 PHP 상호 운용성 허용"이라고 더 많이 생각합니다. 필자가 백서를 쓸 계획이 있는지는 잘 모르겠다. 많은 사람들이 관심을 갖고 있기 때문에해야 할 것이다. Julien의 최근 Hack Dev Day 강연은 하반기 내부 세부 사항에 들어있다. https : // www .youtube.com/watch? v = BnJQJNGkUdM –

+0

Re point (1), 정말 사실입니까? 그런 다음 오류없이 유형을 검사하고 실행하는 [이 예제] (http://pastebin.com/wRXJLGQc)에서 무슨 일이 벌어지고 있습니까? 위에서 언급 한 것처럼 'any'가 해석되었거나 'any'라고하는 알 수없는 일반 유형으로 해석되어 유형 오류가 발생하지 않습니다. – jameshfisher