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

jam*_*her 5 syntax type-systems hacklang

Hack语言类型系统中,是否存在"顶级"类型,也称为"任何"类型,或通用"对象"类型?也就是说,所有类型都是子类的类型?

该手册提到"混合"类型,可能类似,但没有真正解释.在某些地方也可以简单地省略类型声明.但是,这无法在任何地方完成,例如,如果我想将某个函数声明为函数从string顶部类型,我不知道如何执行此操作.function (string): mixed

Jos*_*man 3

我是一名在 Facebook 从事 Hack 工作的工程师。这是一个非常有洞察力和有趣的问题。根据您具体要了解的内容,Hack 有几种不同的变体。

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

<?hh // strict
function f(): mixed {
  return 42;
}
Run Code Online (Sandbox Code Playgroud)

mixed但由于它是所有内容的超类型,因此在对值实际是什么进行案例分析之前,您无法对其进行太多操作,例如 via is_intinstanceof等。下面是如何使用 的结果的示例f()

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

“缺少注释”类型(“any”)与此有些不同。然而,mixed“any”是一切事物的超类型,而“any”则与一切事物统一——它既是一切事物的超类型,又是一切事物的子类型。这意味着,如果您省略注释,我们会假设您知道自己在做什么,然后就让它过去。例如,以下代码类型检查如下:

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

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

希望这能澄清问题——如果您需要澄清,请在评论中告诉我,我会进行编辑。如果您还有其他问题没有严格澄清,请继续将它们标记为“hacklang”,我们将确保它们得到答复!

最后:如果您不介意,您可以在令人困惑或不清楚的文档页面上按“提交文档错误”,或者可以以任何方式改进吗?我们理想地希望 docs.hhvm.com 成为此类内容的一站式场所,但文档中肯定存在漏洞,我们希望像您这样聪明、热情的人能够帮助指出。(即,我认为这些内容在文档中得到了很好的解释,但由于您感到困惑,显然情况并非如此,我们非常感谢详细说明您迷路的错误报告。)