因此,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来说,可能是个不好的例子,因为它并不是这么低,但是你明白了。)
发布于 2014-05-10 21:29:31
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中的一个缺陷。)
https://stackoverflow.com/questions/23584618
复制相似问题