Hacklang — 为什么我不能做一个可为空的循环类型定义?



我正在尝试实现一个类似递归容器的结构,我可以理解为什么无法实现香草循环类型def,但是为什么也不允许以下情况?

typedef cycle = shape('cycle' => ?cycle); // Cyclic typedef (Typing[4014])

创建一个似乎很容易:

$cycle = shape('cycle'=>shape('cycle'=> /* shape(... =>*/ null /* ...) */));

迭代一个应该也没有问题,对吧?

function recurse(cycle $cycle) {
    if(!is_null($cycle['cycle'])) recurse($cycle['cycle']));
}

为您提到的功能请求提供更多色彩。据我所知,形状不能像你建议的那样工作的根本原因。在某些情况下,它甚至会很有用。这完全是一个实现问题 - 至少在我上次熟悉类型检查器代码时,它实际上相当难以实现。(同样,不是出于任何有趣的原因,只是代码是在编写关于如何扩展形状的深刻假设的情况下编写的。也就是说,自从我上次看这个以来,在中间的一年左右的时间里,形状发生了一些变化,现在可能会更容易,我不知道。但是这个功能从来没有重要到值得努力构建 - 也许现在或很快就会有上述形状更新,因为它们的使用范围更广(特别是在FB

)。

去年以来,它目前是facebook/hhvm上的feature-request

最新更新