Programlama dilinde doğrusal tiplerle veri yapıları


15

Doğrusal türleri destekleyen bir programlama diliyle uğraştığımızı varsayalım (doğrusal tip terimleri en fazla bir kez kullanılabilir). Bu, bazı hesaplama etkilerinin (mutasyon, hatta işlenen türünü değiştirme gibi), tür sistemleri yalnızca "sonsuz gerçekler" üzerinde çalışan diller için sorunlu bir şekilde tedavi edilmesine izin verir.

Birçok veri yapısı endüktif tiplerle karakterize edilebilir (listeler ve ağaçlar kanonik örneklerdir). Karışıma doğrusal endüktif tipler eklersek, değiştirilebilir veri yapılarını da ele alabiliriz.

Bununla birlikte, doğrusal tiplerle bir programlama dilinde paylaşım ve döngüsel referanslar sergileyen veri yapılarının nasıl temsil edileceği açık değildir (bu tür veri yapılarının örnekleri, bitişik listelerle veya başka bir şeyle, döngüsel listelerle temsil edilen DAG'lar ve diğer grafiklerdir). Bunu yapabilir miyiz? Mümkün değilse, bu veri yapılarına uyum sağlamak için dili hangi yolla genişletmeliyiz?

Şimdiye kadar bulduğum en ilgili örnek, iki bağlantılı bir listedir. Başka örnekler var mı?

Yanıtlar:


20

Doğrusallık, benzersiz bir durumsal temsili belirlemek için yeterli bir kısıtlama değildir ve bu nedenle sorunuzun cevabı, doğrusal mantığı durum olarak nasıl yorumladığınıza bağlıdır. Bu genellikle yöntem.!A

İstediğiniz referans semantiği, tüm işaretçilerin benzersiz değerler olduğunu söylüyorsa (yani, bir nesneye en fazla tek bir başvuru varsa), o zaman dags ve grafik yapıları ifade edilemez, çünkü bir dag'in birden çok referans içerebileceği aynı nesne. Bu durumda , ve haritalarını istediğiniz için A tipi yeni bir değer yaratan bir hesaplama olmalıdır .!AAε A : ! A AδA:!A!A!AϵA:!AA

Bununla birlikte, paylaşımı temsil etmesini istediğinizi varsayalım . Daha sonra, nesneler referans sayımıyla çöp toplanabilir, ve sadece referans sayılarını işlemler olarak gerçekleştirilebilir. Bu durumda, paylaşım olduğu için değerleri değiştirmenin her zaman güvenli olduğunu varsaymak için doğrusallığı kullanamazsınız. Ancak, programınızdaki tüm bellek ayırma işlemlerinin açık olduğundan ve yığın içinde döngü olmadığından emin olabilirsiniz.δ A : ! A ! A ! Bir ε A : ! A A!AδA:!A!A!AϵA:!Abir

Doğrusal tiplerin en pratik uygulamaları bu iki yorumun hiçbirini kullanmaz . Bunun yerine, referanslar serbestçe kopyalanabilir varlıklar olarak görülür ve doğrusal olarak izlediğimiz şey aslında yeteneklerdir . Yetenekler çalışma zamanı değerleri değildir; bunlar yalnızca bir referansa erişim iznini temsil etmeyi amaçlayan kavramsal varlıklardır. Fikir, izin verme tarzında programlamanızdır ve bu nedenle aynı nesneye birçok referans olsa bile, bir durum parçasının okunması veya değiştirilmesi yalnızca ona erişme yeteneğiniz varsa oluşabilir. Ve yetenek doğrusal olduğundan, bunu yalnızca siz değiştirebileceğinizi bilirsiniz.

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)

Yukarıda çizilen API'de , , derleme zamanı indekslerinin bazı etki alanları ve , türler arasında değişir. Bir tip sahip tarafından indekslenen bir özelliktir ve tip referanslarına türüdür, bir kapasite ile erişilen . Arayan ve bir referans üzerine yeteneği gerektirir ve çağıran yeni bir başvuru ve ortak bir endeks paylaşan yeni yeteneği oluşturur. Ancak,cιαcap(c)cref(α,c)αcgetsetcnewcopy-bir referansı kullanmak herhangi bir yeteneğe erişim gerektirmez, bu nedenle herhangi bir referansı içine bakmadığı sürece kopyalayabilir.


Düşündürücü bir cevap için teşekkür ederim. Yine de ilgileniyorum, takma ad ve paylaşım arasında (teknik) bir ayrım var mı? Sınırsız bir şekilde paylaşıma kadar doğrusaldan (en fazla bir referans) paylaşıma, en fazla n referansla paylaşılabilen sistemler var mı?

1
1. Takma ad ve paylaşım eşanlamlıdır. 2. Evet, Boyland'ın kesirli izinleriyle zenginleştirilen yetenek tarzı yorumlar buna izin verir. Ayrıca bakınız Pottier'in teori için yetenek hesaplarına ilişkin çalışmaları ve Aldrich ve Bierhof'un uygulama için Çoğul çalışmaları.
Neel Krishnaswami
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.