线性度不足以约束唯一的状态表示形式,因此问题的答案取决于您如何根据状态来解释线性逻辑。这通常会反映在您必须如何解释方式中。!一种
如果引用的预期语义表明所有指针都是唯一值(即,最多有一个对象引用),则dag和图结构是不可表达的,这是出于重言式的原因,dag可能包含多个引用。同一对象。在这种情况下,必须是一个计算它创建类型的新价值,既然你想图和。一个δ 一个:!一个⊸ !一个⊗ !一个ε 一:!一个⊸ 一!一种一种δ一种:!一个⊸ !一个⊗ !一种ϵ一种:!一个⊸ 一
但是,假设您希望代表共享。然后,可以使用映射和来通过引用计数对对象进行垃圾收集,这些 操作可以实现只是增加引用计数的操作。在这种情况下,由于存在共享,因此不能使用线性假设来对值进行变异总是安全的。但是您可以确保所有内存分配在您的程序中都是显式的,并且堆中没有周期。δ 一个:!一个⊸ !一个⊗ !一个ε 一:!一个⊸ 一!一种δ一种:!一个⊸ !一个⊗ !一种ϵ一种:!一个⊸ 一
线性类型的大多数实际实现都不使用这两种解释。相反,引用被视为可自由复制的实体,而我们线性跟踪的实际上是功能。功能不是运行时值;它们纯粹是概念上的实体,旨在代表访问引用的权限。这样的想法是,您以许可传递方式进行编程,因此,即使对同一个对象有很多引用,也只有在您也有能力访问状态的情况下,才可以读取或修改状态。由于功能是线性的,因此您知道只有您可以更改它。
ñ Ë W ^克È 吨setcopy::::∀α.α⊸∃c:ι.cap(c)⊗ref(α,c)∀α,c:ι.cap(c)⊗ref(α,c)⊸α⊗cap(c)⊗ref(α,c)∀α,c:ι.cap(c)⊗ref(α,c)⊗α⊸cap(c)⊗ref(α,c)∀α,c:ι.ref(α,c)⊸ref(α,c)⊗ref(α,c)
在上面概述的API中,范围超过,是编译时索引的某个域,而范围则超过类型。我们有一个,它是由索引的功能,而一个类型,是对一个由功能访问的的引用。在引用上调用和需要功能,而调用会创建新的引用和共享公用索引的新功能。但是,cιαcap(c)cref(α,c)αcgetsetcnewcopy-引用不需要访问任何功能,因此任何人都可以复制引用,只要他们不查看它的内部即可。