首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >hacklang中的线性类型:静态地强制函数调用的顺序

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

Stack Overflow用户
提问于 2014-05-10 18:09:32
回答 1查看 166关注 0票数 3

因此,Hacklang推出了一个新的、花哨的类型系统,在这个系统中,必须检查一个可空变量,然后才能使用它。我想知道的是,您能实现一些类似于线性类型的东西吗?静态地强制命令函数调用,常见的例子是在读取文件之前打开它?在伪码中:

代码语言:javascript
复制
$file_handler = get_file_handler("myfile");
$file_handler->open();
$string = $file_handler->read();

现在,不带$file_handler->read()open()将不会抛出运行时异常,只是不编译:

代码语言:javascript
复制
$file_handler = get_file_handler("myfile");
$string = $file_handler->read(); /* Won't compile, must run open() first */

可行吗?

(好吧,对于PHP/Hacklang来说,可能是个不好的例子,因为它并不是这么低,但是你明白了。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-10 21:29:31

Hack目前不支持任何线性类型。对于您正在询问的特定情况,opaque type alias在包装类中可能很有用:(危险,直接输入浏览器的代码,可能有一些小错误,但应该说明想法)

代码语言:javascript
复制
<?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中的一个缺陷。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23584618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档