当前位置: 首页 > 知识库问答 >
问题:

hacklang中的线性类型:静态强制函数调用顺序

蔺昊穹
2023-03-14

因此,Hacklang推出了一个新的、奇特的类型系统,在该系统中,必须先检查一个可为空的变量,然后才能使用它。我想知道的是,你能实现类似线性类型的功能吗,静态地强制函数调用的顺序,常见的例子是在读取文件之前打开文件?在伪代码中:

$file_handler = get_file_handler("myfile");
$file_handler->open();
$string = $file_handler->read();

现在,$file\u处理程序-

$file_handler = get_file_handler("myfile");
$string = $file_handler->read(); /* Won't compile, must run open() first */

可行吗?

(好吧,也许是PHP/Hacklang的坏例子,因为它不是这么低级,但你明白了。)


共有1个答案

郝杰
2023-03-14

Hack目前对线性类型没有任何本机支持。对于您要询问的特定情况,不透明类型别名在包装器类中可能很有用:(危险,直接在浏览器中键入的代码,可能有小错误,但应该说明这一点)

<?hh

newtype closedfile = resource;
newtype openfile = resource;

function get_file_handler(string $filename): closedfile {
  return some_wrapped_function($filename);
}

function open_file_handler(closedfile $file): openfile {
  $file->open();
  return $file;
}

function read(openfile $file): string {
  return $file->read();
}

根据您的应用程序,这样做可能不可能,甚至不是一个好主意,但它最接近我们现在所拥有的。

也就是说,如果你是在设计API而不是使用现有的东西,那么把它设计成没有尚未打开的文件,从一开始就消除这种错误,而不需要任何类型的系统杂技,这可能是一个好主意必须的。(基本上,至少在我看来,这是一个应用编程接口设计问题,而不是类型系统问题!即使您可以使用类型系统静态地使无效代码成为错误,API的使用者甚至可以编写该代码并认为它具有潜在意义的事实也是API的一个缺陷。(

 类似资料:
  • 问题内容: 我有以下ReactJS类: 但是我有以下错误: 我不明白 这是调用静态函数的好方法吗?我认为react正在使用静态进行某些操作,但我不知道该怎么做。 问题答案: 需要在类而非实例上访问静态方法。因此,在您的情况下,请使用: 但是,静态方法将无法访问-基于上面的代码示例,我不认为您希望该方法是静态的。 更多:ES6中的静态成员

  • 问题内容: 这来自有效的Java: 请注意,操作常量是从创建常量之后运行的静态块放入stringToEnum映射中的。试图使每个常量从其自己的构造函数中放入映射中将导致编译错误。这是一件好事,因为如果合法,它将导致NullPointerException。除编译时常量字段外,不允许枚举构造函数访问枚举的静态字段。此限制是必需的,因为在构造函数运行时尚未初始化这些静态字段。 我的问题是关于这条线的:

  • 问题内容: 我一直使用泛型,并且总是看到这样使用尖括号:(例如)。 今天,在调用类似的静态方法之前,我遇到了泛型规范。真正的示例是:。 我从未见过这种用法,也无法在文档中找到这种特定用法。有人可以解释发生了什么吗? 问题答案: 这些被称为通用方法。 在Java 7之前,您必须指定通用引用的类型: 现在,编译器从上下文推断类型。

  • 本文向大家介绍多态性的类型-临时,包含,参数和强制,包括了多态性的类型-临时,包含,参数和强制的使用技巧和注意事项,需要的朋友参考一下 在这里,我们将看到不同类型的多态性。类型是- 特别指定 包容性 参数 强迫 Ad-Hoc多态称为超载。这允许具有相同名称的函数针对不同类型以不同的方式起作用。函数和运算符都可以重载。某些语言不支持运算符重载,但是函数重载是常见的。 示例 输出结果 包含多态性称为子

  • 问题内容: 没有静态成员可以使用类型参数,但是可以使用泛型类型参数调用静态成员吗​​?例如:- 这里的add()是一个静态方法。 在类似的主题上也有一些C#问题和答案,但是我不太确定如何在Java中使用它。 问题答案: 不,如果A是泛型类型,则无法执行。(Bozho对fast的回答是:),可能认为A是具体类型。 可行的方法如下。 但这可能不是您想要的。 阅读您的评论后,听起来您真正想要做的是: 您

  • 我最近一直在试验线性类型,一直在想下面的转换是否可能。如果没有线性类型,它肯定是无效的。 目的是降低高阶函数参数。这应该是可以的,因为线性类型确保HOF只被调用一次,所以正好存在一个值。问题是如何避开lambda并观察