Hack语言中的顶级类型是什么?

时间:2014-04-13 23:09:40

标签: syntax type-systems hacklang

the Hack language类型系统中,是否存在“顶级”类型,也称为“任何”类型或通用“对象”类型?也就是说,所有类型都是?

的子类的类型

The manual mentions "mixed" types,可能类似,但没有真正解释过。在某些地方也可以简单地省略类型声明。但是,这无法在任何地方进行,例如:如果我想声明某个函数从string到顶部类型,我不清楚我是如何做到这一点的。 function (string): mixed

1 个答案:

答案 0 :(得分:3)

我是一名在Facebook工作的工程师。这是一个非常有见地和有趣的问题。根据您的具体情况,Hack有几种不同的变体。

首先,我们来谈谈mixed。这是一切的超类型。例如,这个类型检查:

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

但由于它是所有内容的超类型,因此在您通过mixedis_int等分析其实际情况之前,您无法使用instanceof值。以下是您必须使用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();
}

这显然不合理 - 我们只是打破了类型系统,如果我们执行上面的代码会导致运行时类型错误 - 但是为了简化转换,它在部分模式下被允许。严格要求您注释所有内容,因此如果您的所有代码都是严格的,那么您无法获得类型“any”的值以便以这种方式破坏类型系统。考虑一下如何在严格模式下注释上面的代码:f2必须返回int,这将是一个直接类型错误(“字符串与int不兼容”) ,或f2必须返回mixed,这将是写入的类型错误(“字符串与混合”不兼容),直到您使用is_int等进行案例分析在我之前的例子中做过。

希望这可以解决问题 - 如果你想澄清,请在评论中告诉我,我会编辑。如果您有其他问题没有严格澄清,请继续标记“hacklang”,我们会确保他们得到回应!

最后:如果您不介意,您是否可以在文档页面上按“提交文档错误”,这些错误或不清楚,或者可以以任何方式进行改进?理想情况下,我们希望docs.hhvm.com成为像这样的东西的一站式地方,但是文档中肯定存在漏洞,我们希望聪明,像你这样热心的人会帮助指出。 (也就是说,我认为这些东西在文档中得到了很好的解释,但是由于你很困惑,显然不是这种情况,我们真的很感谢一个错误报告,详细说明了你丢失的地方。)

相关问题