線形性は、一意のステートフル表現を特定するのに十分な制約ではないため、質問に対する答えは、状態に関する線形論理の解釈方法によって異なります。これは通常、解釈方法に反映されます。!Aモダリティ。
参照の意図したセマンティクスが、すべてのポインターが一意の値であると言う場合(つまり、オブジェクトへの参照は最大で1つ)、DAGとグラフ構造は表現できません。同じオブジェクト。この場合には、は、マップおよび Aが必要なため、タイプAの新しい値を作成する計算でなければなりません。!AAδA:!A⊸!A⊗!AϵA:!A⊸A
ただし、が共有を表すと仮定します。次に、マップおよびを使用して、オブジェクトを参照カウントでガベージコレクション できます。この場合、共有があるため、値を変更しても常に安全であると仮定するために線形性を使用することはできません。ただし、プログラムですべてのメモリ割り当てが明示的に行われ、ヒープにサイクルがないことを確認できます。!AδA:!A⊸!A⊗!AϵA:!A⊸A
線形型のほとんどの実用的な実装では、これら2つの解釈のどちらも使用しません。代わりに、参照は自由に複製可能なエンティティと見なされ、直線的に追跡するのは実際には機能です。機能はランタイム値ではありません。これらは、参照へのアクセス許可を表すことを目的とした純粋に概念的なエンティティです。アイデアは、許可を渡すスタイルでプログラムするということです。したがって、同じオブジェクトへの参照が多数ある場合でも、状態の一部の読み取りまたは変更は、アクセスできる機能を持っている場合にのみ発生します。また、機能は線形であるため、変更できるのは自分だけであることがわかります。
newgetsetcopy::::∀α.α⊸∃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-参照を作成するために機能にアクセスする必要はありません。そのため、参照しない限り誰でも参照をコピーできます。