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

时间:2014-05-10 18:09:33

标签: hacklang linear-types

所以Hacklang推出了一个新的,花哨的类型系统,在可以使用它之前必须检查一个可以为空的变量。我想知道的是,你能实现类似线性类型的东西,静态强制函数调用的顺序,常见的例子是在读取之前打开文件吗?在伪代码中:

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

现在,$file_handler->read()没有open()而不是抛出运行时异常,而不是编译:

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

可行?

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

1 个答案:

答案 0 :(得分:6)

Hack目前对线性类型没有任何原生支持。对于您要问的特定情况,opaque type alias在包装类中可能有用:(危险,代码直接输入浏览器,可能有轻微错误,但应说明想法)

<?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的使用者甚至可以写出代码并认为它​​的潜在意义是API的缺陷。)