线性类型的编程语言中的数据结构


15

假设我们正在使用一种支持线性类型的编程语言(可以说,线性类型的术语最多可以使用一次)。这允许以某种对语言有问题的方式来处理某些计算效果(例如,变异,甚至更改操作数的类型),而语言的类型系统仅对“永恒的真理”起作用。

许多数据结构可以用归纳类型来表征(列表和树是典型示例)。如果将线性归纳类型添加到混合,我们还可以处理可变数据结构。

但是,我尚不清楚如何用线性类型的编程语言来表示表现出共享和循环引用的数据结构(此类数据结构的示例是DAG和其他图,由邻接表或其他东西(循环列表)表示)。我们能做到吗?如果不可能,我们应该以哪种方式扩展语言以适应这种数据结构?

到目前为止,我发现的最复杂的示例是一个双向链接列表。还有其他例子吗?

Answers:


20

线性度不足以约束唯一的状态表示形式,因此问题的答案取决于您如何根据状态来解释线性逻辑。这通常会反映在您必须如何解释方式中。一种

如果引用的预期语义表明所有指针都是唯一值(即,最多有一个对象引用),则dag和图结构是不可表达的,这是出于重言式的原因,dag可能包含多个引用。同一对象。在这种情况下,必须是一个计算它创建类型的新价值,既然你想图和。一个δ 一个一个一个一个ε 一个一种一种δ一种一种一种一种ϵ一种一种一种

但是,假设您希望代表共享。然后,可以使用映射和来通过引用计数对对象进行垃圾收集,这些 操作可以实现只是增加引用计数的操作。在这种情况下,由于存在共享,因此不能使用线性假设来对值进行变异总是安全的。但是您可以确保所有内存分配在您的程序中都是显式的,并且堆中没有周期。δ 一个一个一个一个ε 一个一种δ一种一种一种一种ϵ一种一种一种

线性类型的大多数实际实现都不使用这两种解释。相反,引用被视为可自由复制的实体,而我们线性跟踪的实际上是功能。功能不是运行时值;它们纯粹是概念上的实体,旨在代表访问引用的权限。这样的想法是,您以许可传递方式进行编程,因此,即使对同一个对象有很多引用,也只有在您也有能力访问状态的情况下,才可以读取或修改状态。由于功能是线性的,因此您知道只有您可以更改它。

new:α.αc:ι.cap(c)ref(α,c)get:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)set:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)copy:α,c:ι.ref(α,c)ref(α,c)ref(α,c)

在上面概述的API中,范围超过,是编译时索引的某个域,而范围则超过类型。我们有一个,它是由索引的功能,而一个类型,是对一个由功能访问的的引用。在引用上调用和需要功能,而调用会创建新的引用和共享公用索引的新功能。但是,cιαcap(c)cref(α,c)αcgetsetcnewcopÿ-引用不需要访问任何功能,因此任何人都可以复制引用,只要他们不查看它的内部即可。


谢谢您发人深省的答案。我很感兴趣,但是别名和共享之间是否存在(技术上的)区别?是否有任何系统可以从线性(最多一个参考)逐渐由最多n个参考共享到无限制共享?

1
1.别名和共享是同义词。2.是的,这种能力风格的解释加上博伊兰的零碎许可允许这样做。另请参见Pottier最近关于能力计算的理论研究,以及Aldrich和Bierhof关于Plural的实施工作。
Neel Krishnaswami
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.