Linearitas bukan kendala yang cukup untuk menjabarkan representasi stateful yang unik, dan jawaban untuk pertanyaan Anda tergantung pada bagaimana Anda menafsirkan logika linier dalam hal negara. Ini biasanya akan tercermin dalam bagaimana Anda harus menafsirkan !A modalitas.
Jika semantik referensi yang Anda maksudkan mengatakan bahwa semua pointer adalah nilai unik (yaitu, paling banyak ada satu referensi ke suatu objek) maka dags dan struktur grafik tidak dapat diekspresikan, untuk jenis alasan tautologis bahwa dag dapat berisi banyak referensi ke objek yang sama. Dalam hal ini, harus menjadi perhitungan yang menciptakan nilai baru tipe A , karena Anda ingin peta δ A : ! A ⊸ ! A ⊗ ! A dan ε A : ! A ⊸ A!AAδA:!A⊸!A⊗!AϵA:!A⊸A .
Namun, anggaplah Anda menginginkannya untuk mewakili berbagi . Kemudian, objek dapat dikumpulkan dengan penghitungan referensi, dengan peta !A dan ε A : ! A ⊸ A dapat direalisasikan sebagai operasi yang hanya meningkatkan jumlah referensi. Dalam hal ini, Anda tidak dapat menggunakan linearitas untuk menganggap bahwa selalu aman untuk mengubah nilai, karena ada pembagian. Tetapi Anda dapat memastikan bahwa semua alokasi memori eksplisit dalam program Anda, dan bahwa tidak ada siklus di heap.δA:!A⊸!A⊗!AϵA:!A⊸A
Kebanyakan implementasi praktis dari tipe linear tidak menggunakan kedua interpretasi ini. Sebaliknya, referensi dipandang sebagai entitas yang dapat digandakan secara bebas, dan apa yang kami lacak secara linear sebenarnya adalah kemampuan . Kemampuan bukan nilai runtime; mereka murni entitas konseptual yang dimaksudkan untuk mewakili izin untuk mengakses referensi. Idenya adalah bahwa Anda memprogram dengan gaya izin-lewat, dan bahkan jika ada banyak referensi ke objek yang sama, pembacaan atau modifikasi sepotong negara hanya dapat terjadi jika Anda juga memiliki kemampuan untuk mengaksesnya. Dan karena kemampuannya linier, Anda tahu bahwa hanya Anda yang dapat mengubahnya.
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)
cιαcap(c)cref(α,c)αcgetsetcnewcopy